【发布时间】:2014-07-31 15:19:22
【问题描述】:
我正在使用 Mysql,我有两个表-
BusDetails
+-------+-----------+
| busId | BusName |
+-------+-----------+
| 1 | A TRAVELS |
| 2 | B TRAVELS |
| 3 | C TRAVELS |
+-------+-----------+
AreaDetails
+--------+----------+
| cityId | cityName |
+--------+----------+
| 1 | ABC |
| 2 | DEF |
| 3 | GHI |
| 4 | JKL |
+--------+----------+
现在我必须创建第三个表,它将公共汽车表映射到城市表。假设 busId 1 停在 cityId 2 和 3, bustId 2 停在 cityId 1 和 4。要创建这个场景,我有 2 个选项-
first option-
+-------+--------+
| busId | areaId |
+-------+--------+
| 1 | 3,2 |
| 2 | 4,1 |
+-------+--------+
second option-
+-------+--------+
| busId | areaId |
+-------+--------+
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 4 |
+-------+--------+
将来当有大量记录时,哪个表会提供更好的性能?为什么?
【问题讨论】:
-
我认为第二个选择是面糊。由于您将在此场景中管理一对多关系。因此您可以轻松找到与公共汽车或区域相关的任何信息。
-
了解数据库规范化。逗号分隔的列表在关系数据库中是邪恶的。
-
@Barmar 那么冗余呢?如果我选择第二个选项,我会一次又一次地重复 busId。
-
如果每个人都描述一个独立的关系,这不是多余的。如果映射表中还有
busName,那将是多余的。 -
这是关系数据库模型与分层和网络模型之间的区别。当你有一个多对多的关系时,你必须列出所有的对。