質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

934閲覧

レコード同士のペアをどうモデリングするか【姉妹都市の関連のデータモデリング】

LEBIPHIDE

総合スコア15

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2021/10/27 11:05

編集2021/10/27 11:06

データモデリングの経験に乏しく、どのように検索すれば求める情報にたどり着くのか分からなかったのでこちらで質問いたしました

状況

都市のデータが入っているテーブルがあるとします
都市は追加されることがあります

cities

idcity-name
01A
02B
03C
04D
05E

このうち、都市同士で以下の条件で姉妹都市協定が結ばれているとします

  • 協定は、2都市間でのみ結ばれる
  • 都市は、複数の都市と協定を結ぶことができる

DBに接続するアプリでは、都市IDを引数にその都市の姉妹都市の配列を返却する関数を実装したいとします、
このとき、どのようなデータモデリングがベストプラクティスになるのでしょうか

案 : ペアテーブルのようなものを作る

city-pairs

pair-idcity-id-1city-id-2
10102
20103
30105
40203
50304
60305

ひとつの姉妹都市ペアをひとつのレコードとして表現するのは扱いづらいでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

モデリングの観点から言うと、「姉妹都市協定」を独立したエンティティと考えるのが素直ですね。

そのエンティティは案の内容(組み合わせに重複が無い)で問題無いと思います。
※但し、ペアの格納順のルールは必要でしょうけど。

DBに接続するアプリでは、都市IDを引数にその都市の姉妹都市の配列を返却する

姉妹都市協定を結んでいる都市の一覧を配列でという事でしたら、SQLレベルで配列操作が可能なDBMS(Postgres、BigQueryなど)もありますので選定の条件とするのもアリだと思います。

例えばpostgresだと以下のSQLで配列が返却されます。

SQL

1select array_agg(city_id order by city_id) 2from ( 3 select unnest(array[city_id_1,city_id_2]::text[]) as city_id 4 from city_pairs 5 where '02' in (city_id_1, city_id_2) 6) step1 7where city_id !='02'

投稿2021/10/27 14:05

編集2021/10/27 14:30
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

その案でいいと思います。
入力もしやすいので。

特定都市の姉妹都市の一覧は、
city-pairs と city-id-1、city-id-2 を入れ替えたものをUNIONで連結したものに抽出条件を設定すればいいでしょう。

sql

1SELECT T.[city-id-2] 2FROM 3 (SELECT [city-id-1], [city-id-2] 4 FROM [city-pairs] 5 UNION ALL 6 SELECT [city-id-2], [city-id-1] 7 FROM [city-pairs] 8 ) AS T 9WHERE T.[city-id-1]=3;

投稿2021/10/27 11:41

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問