通过多个表“级联”外键?

时间:2017-05-16 08:49:27

标签: mysql database

假设我有3个数据库表:CountriesProvincesCities

  • Countriesid(PK)和name
  • Provincesid(PK),namecountry_id(FK)。
  • Citiesid(PK),nameprovince_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                   |
+----+-----------+-------------+---------------------+

我能解释一下吗?

编辑:也许答案可能是识别和非识别关系? (我不知道。)

2 个答案:

答案 0 :(得分:0)

您应该尽可能简化结构,直到它实际影响性能。

在发动机级别进行了大量工作,以便在进行查询时使用索引,因此最好的选择是创建索引,包括您将过滤的所有字段

否则,国家,省市看起来像小桌子,所以总体性能影响无论如何都不会引人注意。

答案 1 :(得分:0)

这使您的插入和更新更加复杂,并且绝对应该使用所有关联表上的触发器来处理更新。这样,如果该省的国家发生变化,该省的城市国家也将自动改变。您还必须注意,countryid值的来源在插入到省和插入到城市之间是一致的。您必须小心保持数据完整性。

然而,有一个商业案例,这样做是有意义的。

那是:

  • 当id不太可能经常更改时(通常会在更新时进行额外的工作)
  • 当针对子表的大部分查询执行时 不需要来自中间表的任何信息
  • 并且优选地在父表中的描述符信息是 通常不需要。

例如,我们为clientid执行此操作,因为客户端永远不会在我们的系统中更改。几乎所有下级表的查询都需要由客户端过滤,但最终查询中很少需要客户端名称。通过在我们大多数查询中不需要的东西中删除几层连接,使得clientid非常规化是有意义的。

但是,在您的情况下,虽然可能满足第一个条件,您是否真的要按国家/地区进行过滤而不需要省或城市?我觉得这不太可能。当然,我不熟悉您的数据使用方式;可能我错了。我认为在这种情况下,通过这样做,数据完整性的风险可能高于增益。