我对识别一对多关系的含义有一些疑问。我读了一些关于堆栈溢出的其他相关问题,但我需要更多信息:)
假设我们有表“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的一部分。这有点令人困惑:))
答案 0 :(得分:6)
如果城市的密钥是(country_id,city_id),则关系是“识别” - 意味着主键部分或全部是对另一个表的外键引用。如果country_id不是主键的一部分,则它是非标识的。
这两个不同的键会使表格在每种情况下代表非常不同的东西,但只有你可以说哪个更符合你的要求。
不要过于担心识别与非识别关系的概念。这是一个源于ER建模的概念,但在关系数据库设计中,它通常具有很小的实际意义。
答案 1 :(得分:2)
您在自己的示例数据中有针对您的建议的反驳论据。 London
在英格兰和法国都是一个城市,但它们不是同一个城市;该城市不是由city_id
标识的,country_id
是城市的名称,而是city_id
,{{1}}对。这种数据没有其他自然的关键。如果你想要一个单列主键,你将被迫发明一个代理键作为主键(比如一个自动增量的整数)
答案 2 :(得分:2)
根据定义,标识关系使用引用记录的主键。
您的上一个解决方案看起来就像您需要的解决方案。但它没有识别关系。