Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql &引用;“级联”;外键通过多个表?_Mysql_Database - Fatal编程技术网

Mysql &引用;“级联”;外键通过多个表?

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 国

假设我有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 | 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不太可能频繁更改时(通常更新时很少会发生额外工作)
  • 当针对子表的查询的很大一部分 不需要中间表中的任何信息
  • 并且优选地,当父表中的描述符信息为 通常不需要
例如,我们对clientid执行此操作,因为客户端在我们的系统中从不更改。几乎所有下级表的查询都需要按客户端进行筛选,但在最终查询中很少需要客户端名称。通过将我们在大多数查询中不需要的东西的连接切掉几层,对clientid进行非规范化是有意义的

然而,在您的情况下,虽然第一个条件可能已经满足,但您真的要按国家过滤而不需要省或市吗?我会发现这种情况不太可能发生。当然,我不熟悉您的数据是如何使用的;这可能是我弄错了。我认为在这种情况下,这样做对数据完整性的风险将高于收益