Mysql &引用;“级联”;外键通过多个表?
假设我有3个数据库表:Mysql &引用;“级联”;外键通过多个表?,mysql,database,Mysql,Database,假设我有3个数据库表:国家,省和城市 国家有id(主键)和名称 省份有id(PK)、名称和国家id(FK) 城市有id(PK)、名称和省id(FK) 我的问题是:Cities表中的country\u id也可以作为FK吗?我的意思是,这个国家id将是省表的FK(provices\u Countries\u id),而不是国家直接PK。我的朋友说这对性能更好。但是,当您有很多表时,拥有以前所有表的FK可能会很乏味。例如,关系中有8个表,最后一个表可以有8+FK,而不是最后一个表PK作为FK 国
国家
,省
和城市
有国家
(主键)和id
名称
有省份
(PK)、id
和名称
(FK)国家id
有城市
(PK)、id
和名称
(FK)省id
Cities
表中的country\u id
也可以作为FK吗?我的意思是,这个国家id
将是省
表的FK(provices\u Countries\u id
),而不是国家
直接PK。我的朋友说这对性能更好。但是,当您有很多表时,拥有以前所有表的FK可能会很乏味。例如,关系中有8个表,最后一个表可以有8+FK,而不是最后一个表PK作为FK
国家/地区表:
+----+-----------+
| id | name |
+----+-----------+
| 1 | France |
+----+-----------+
+----+-----------+------------+
| id | name | country_id |
+----+-----------+------------+
| 1 | Languedoc | 1 |
+----+-----------+------------+
+----+-----------+-------------+---------------------+
| id | name | province_id | province_country_id |
+----+-----------+-------------+---------------------+
| 1 | Toulouse | 1 | 1 |
+----+-----------+-------------+---------------------+
省份表:
+----+-----------+
| id | name |
+----+-----------+
| 1 | France |
+----+-----------+
+----+-----------+------------+
| id | name | country_id |
+----+-----------+------------+
| 1 | Languedoc | 1 |
+----+-----------+------------+
+----+-----------+-------------+---------------------+
| id | name | province_id | province_country_id |
+----+-----------+-------------+---------------------+
| 1 | Toulouse | 1 | 1 |
+----+-----------+-------------+---------------------+
城市表:
+----+-----------+
| id | name |
+----+-----------+
| 1 | France |
+----+-----------+
+----+-----------+------------+
| id | name | country_id |
+----+-----------+------------+
| 1 | Languedoc | 1 |
+----+-----------+------------+
+----+-----------+-------------+---------------------+
| id | name | province_id | province_country_id |
+----+-----------+-------------+---------------------+
| 1 | Toulouse | 1 | 1 |
+----+-----------+-------------+---------------------+
我能解释一下吗
编辑:也许答案可以是关于确定和不确定的关系?(我不知道。)在实际影响性能之前,您应该尽量保持结构简单 在引擎级别,在进行查询时,需要花费大量精力来使用索引,因此最好的办法是创建索引,包括所有要过滤的字段
否则,国家/地区、省份和城市看起来就像一个小表,因此总体性能影响不会明显。这会使插入和更新变得更加复杂,更新肯定应该在所有相关表上使用触发器来处理。这样,如果该省的国家发生变化,该省的城市国家也会自动发生变化。您还必须注意,countryid值的来源在insert to PROVICE和insert to city之间是一致的。您确实必须小心维护数据完整性 然而,在一个商业案例中,这样做是有意义的 即:
- 当id不太可能频繁更改时(通常更新时很少会发生额外工作)
- 当针对子表的查询的很大一部分 不需要中间表中的任何信息
- 并且优选地,当父表中的描述符信息为 通常不需要