database - 识别一对多关系

标签 database database-design

我对识别一对多关系的含义有一些疑问。我阅读了一些关于堆栈溢出的其他相关问题,但我需要更多信息:)

假设我们有表“Country”和表“Cities”。在我看来,这是一对多识别关系的例子。但是当我使用 MySql Workbench 在这两个表之间创建一对多标识关系时,我得到以下信息:

Countries
---------
country_id (PK)
...

Cities
--------
city_id    (PK)
country_id (PK)
...

我们在 Cities 表中有复合主键,它将允许该表中的以下行(假设 country_id 和 city_id 是字符串以提高可读性):

1) France, Paris
2) England, London
3) England, Manchester
4) France, London

为了使其正确,我们需要对city_id 进行UNIQUE 约束,使其只能属于一个国家。但是,在 Cities 表中将 country_id 设置为 NOT_NULL (FK) 并获得相同的效果不是更清楚吗:

Cities
---------
city_id (PK)
country_id (FK) (NOT_NULL) 

那么,这种关系是识别关系还是非识别关系?在我看来,它是“逻辑上识别”的,但根据定义它是非识别的,因为父 PK 不是子 PK 的一部分。这有点令人困惑:)

最佳答案

如果 cities 的键是 (country_id, city_id) 那么这种关系是“识别”的——这意味着主键部分或全部是对另一个表的外键引用。如果 country_id 不是主键的一部分,则它是非标识性的。

这两个不同的键会使表格在每种情况下代表非常不同的东西,但只有你能说出哪个更符合你的要求。

不要太担心识别关系与非识别关系的概念。这是一个起源于 ER 建模的概念,但在关系数据库设计中它通常没有什么实际意义。

关于database - 识别一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7030085/

相关文章:

database - 您绝对需要数据库中的外键吗?

mysql - 如何设计和优化网站的数据库,以便为每个链接提供多个图像功能

php - 投票脚本,简化数据库查询的可能性

c - 数组上的 bool 搜索

php - 迭代 MySQL 关联数组以构建新的 MySQL 结果集

sql - 使用 IN/INTERSECT、INNER JOIN 或 EXISTS 进行交叉查询?

sql-server - 根据参数值左连接结果

php - 一旦在两个数据库之间发现至少一个相似性,如何显示表中的所有列?

sql - 嵌套的物化 View 找出提交时的操作?

javascript - 聊天应用程序 - 向 MongoDB 发送多个同时请求