Database 确定一对多关系

Database 确定一对多关系,database,database-design,Database,Database Design,我对确定一对多关系的含义有一些疑问。我读了一些关于堆栈溢出的其他相关问题,但我需要更多的信息:) 假设我们有表“国家”和表“城市”。在我看来,这是一对多识别关系的例子。但是,当我使用MySql Workbench在这两个表之间创建一对多标识关系时,我得到了以下结果: Countries --------- country_id (PK) ... Cities -------- city_id (PK) country_id (PK) ... 我们在Cities表中有复合主键,它将允许该

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

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

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

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

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

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

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

您在自己的示例数据中有您建议的反论点
伦敦
在英国和法国都是一座城市,但它们不是同一座城市;城市不是通过城市的名称
city\u id
,而是通过成对的
country\u id
city\u id
来识别的。对于此类数据,没有其他自然键。如果您想要一个单列主键,您将被迫发明一个代理键作为主键(例如,一个自动递增的整数)

根据定义,标识关系使用引用记录的主键

您的最后一个解决方案看起来正是您需要的。但是它不是标识关系。

如果cities的键是(country\u id,city\u id),那么该关系是“标识的”——这意味着主键部分或全部是对另一个表的外键引用。如果国家/地区id不是主键的一部分,则它是不可识别的

这两个不同的键将使表在每种情况下表示非常不同的内容,但只有您可以说哪个更适合您的需求


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

谢谢您的回复。但是如果(country_id,city_id)是“Cities”表的主键,city_id列另外设置为唯一。当我将city_id作为主键,country_id作为外键时,该解决方案在技术上是否与我的上一个解决方案相同?所以我会有两个等价的解决方案,一个是确定的,另一个是非确定关系的?如果city\u id对它有唯一性约束,那么(country\u id,city\u id)就不能是“主键”,因为主键根据定义是不可约的。我也不明白为什么您希望(国家id、城市id)和(城市id)都具有唯一性约束。这将实现什么?它将实现以下目标:一个国家可以有多个城市,但一个城市只能属于一个国家。如果我省略city_id中的唯一约束,那么:一个国家可以有多个城市,但城市也可以属于多个国家。表县包含世界上所有的国家。表“城市”包含世界上所有城市。所以我需要一种方法在表格中指定哪个国家属于哪个城市。我可以通过两种方式来实现:a)标识城市id另外设置为唯一的关系,或者b)城市id是主键,国家id只是外键。在这两种情况下,(国家id,城市id)上的唯一性约束都是多余的。放下它,让城市id唯一。在案例b)中,(国家id,城市id)没有唯一性约束。主键是city\u id,所以默认情况下它是唯一的,而country\u id只是外键,所以它不是唯一的:)但这就是解决方案,所以我认为案例已经结束。非常感谢。谢谢,我原以为是这样的,但最好问一下:)我想我现在明白了。所以,如果我们不知道父键,那么标识关系的子表就没有意义了?换句话说,如果我们没有关于父母的信息,孩子就无法通过任何方式识别,因为信息不完整:)因此,识别/非识别关系只是抽象概念,我们可以使用它们来获得相同的解决方案(正如我在回答dportas时解释的那样)?我忘了说,在我看来,city_id是世界上任何城市的完整标识符,因此它具有代理密钥的属性,可以被视为一个。这就是为什么我说(法国、伦敦)的行不正确,而且city_id必须设置为unique列。
Cities
---------
city_id (PK)
country_id (FK) (NOT_NULL)