Pythonにおけるデータベースのテーブル結合
ユーザーの名前と居住都市を格納するテーブルがあるとします:
| 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 |
実践的なタスク
商品(名前、価格、数量)とそれらの商品のカテゴリを格納する必要があるとします。 格納構造を記述してください。
河川と、それらの河川が流れ込む海を格納する必要があるとします。 格納構造を記述してください。
都市と、それらの都市が位置する国を格納する必要があるとします。 格納構造を記述してください。