假设我有3个数据库表:Countries
,Provinces
和Cities
。
Countries
有id
(PK)和name
。Provinces
有id
(PK),name
和country_id
(FK)。Cities
有id
(PK),name
和province_id
(FK)。我的问题是:country_id
表中的Cities
和FK一样好吗?我的意思是,此Country_id
将是Provinces
表格的FK(Pronvices_Countries_id
),而不是Countries
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 |
+----+-----------+-------------+---------------------+
我能解释一下吗?
编辑:也许答案可能是识别和非识别关系? (我不知道。)答案 0 :(得分:0)
您应该尽可能简化结构,直到它实际影响性能。
在发动机级别进行了大量工作,以便在进行查询时使用索引,因此最好的选择是创建索引,包括您将过滤的所有字段。
否则,国家,省市看起来像小桌子,所以总体性能影响无论如何都不会引人注意。
答案 1 :(得分:0)
这使您的插入和更新更加复杂,并且绝对应该使用所有关联表上的触发器来处理更新。这样,如果该省的国家发生变化,该省的城市国家也将自动改变。您还必须注意,countryid值的来源在插入到省和插入到城市之间是一致的。您必须小心保持数据完整性。
然而,有一个商业案例,这样做是有意义的。
那是:
例如,我们为clientid执行此操作,因为客户端永远不会在我们的系统中更改。几乎所有下级表的查询都需要由客户端过滤,但最终查询中很少需要客户端名称。通过在我们大多数查询中不需要的东西中删除几层连接,使得clientid非常规化是有意义的。
但是,在您的情况下,虽然可能满足第一个条件,您是否真的要按国家/地区进行过滤而不需要省或城市?我觉得这不太可能。当然,我不熟悉您的数据使用方式;可能我错了。我认为在这种情况下,通过这样做,数据完整性的风险可能高于增益。