データベースにおけるテーブルの結合
ユーザー名と彼らが住んでいる都市を格納するテーブルがあるとします:
| id | name | city |
|---|---|---|
| 1 | user1 | city1 |
| 2 | user2 | city1 |
| 3 | user3 | city2 |
| 4 | user4 | city1 |
| 5 | user5 | city3 |
| 6 | user6 | city2 |
このテーブルの欠点は、同じ都市が異なるユーザーのために何度も繰り返されることです。 これはいくつかの問題を引き起こします。
第一に、繰り返しによってデータベースがはるかに多くの容量を占めるようになります。
第二に、都市に対する操作を行うのがかなり不便です。 たとえば、すべての都市のリストを画面に表示したいとします。 そう簡単にはできません。 すべてのユーザーとその都市を取得し、次に取得した都市から重複を削除し、その後に初めてリストが得られます。
ここで、データベースに 10000 人のユーザーが 10 の都市にいるとします - この 10 の都市のために、膨大な数の行からテーブル全体を取得する必要があります - これは非常に遅い操作となり、無意味なリソースの浪費です。
問題の解決策
テーブルを2つに分割する必要があります: 1つには都市を格納し、もう1つにはユーザーを格納します。
このとき、ユーザーテーブルには、ユーザーの都市を参照する city_id という列が含まれます。
それでは、2つのテーブルを作成しましょう。 都市テーブル:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
ユーザーテーブル:
| id | name | city_id |
|---|---|---|
| 1 | user1 | 1 |
| 2 | user2 | 1 |
| 3 | user3 | 2 |
| 4 | user4 | 1 |
| 5 | user5 | 3 |
| 6 | user6 | 2 |
商品(名前、価格、数量)とそれらの商品のカテゴリを格納する必要があるとします。 格納構造を説明してください。
川と、それらの川が流れ込む海を格納する必要があるとします。 格納構造を説明してください。
都市と、それらの都市が所在する国を格納する必要があるとします。 格納構造を説明してください。