识别和识别关系

时间:2017-10-22 17:38:58

标签: mysql database identifying-relationship

首先,我已经阅读了几个类似的问题,其中“技术”答案看起来像C& P.我需要的是一个明显的例子。归一化是3NF。

在此项目中,在管理面板中,您必须创建城市和区域,并且每个区域必须属于一个城市。同时创建酒店并在相应的区域中分配它们,最后为每个特定酒店创建别名,因为人们知道不同名称的同一酒店。表酒店和hotels_alias将填写自动填充输入。

价格计算是根据服务(标准,私人和VIP)进行的,具体取决于区域,根据乘客人数和季节,我仍然没有创建逻辑或表来计算每位乘客的价格和季节。这就是为什么它们不在下图中。

我发现一个很好的解释是 What's the difference between identifying and non-identifying relationships?

但是我有些疑惑。

Example 1

如果没有没有区域表的情况下不能存在的酒店酒店,

hotels_alias就不可能存在。如果没有城市,这又不存在。由于城市分为多个区域,酒店属于这些区域,区域属于城市,酒店别名属于酒店,如果没有酒店则不能存在。

到目前为止,很明显城市是强大的或母公司实体,而区域,酒店和酒店_alias是儿童实体。

在EER图表中,您可以看到它具有识别关系。第一个问题是:尽管儿童实体拥有自己的身份证,但这是否正确?并且这个ID是PK和NN和AI?在一些示例中,这些子实体没有自己的ID,因此它们的PK由相关表中的两个FK形成,如N:N(zones_has_servicees)关系。

如果实际上子表不必拥有自己的ID,因为他们必须能够通过父表识别自己,那么您将如何更新或删除某个区域,酒店或酒店别名?

DELETE FROM zones WHERE name = 'name'

这是对的吗?我应该为名称列创建索引吗?如果有的话,使用name colum而不是自己的ID会有什么优势呢?子表是否可以拥有自己的ID并使用此ID和其父表的ID创建复合PK?这种关系是否有任何功能,还是只适用于像InnoDB这样的引擎?执行ON DELETE CASCADE操作?

如果我有两个同名的区域,会发生什么?例如:酒店区,坎昆和图卢姆两个城市都有这个区域。制作DELETE将是?:

DELETE FROM zones WHERE name = 'name' AND cities_id = ID

了解父实体和子实体是什么,然后WordPress创建下面的关系,你可以看到它与wp_postmeta和wp_posts使用弱关系。假设没有wp_posts就不能存在wp_postmeta,对吗?它对评论和用户也是如此。

WP EER

1 个答案:

答案 0 :(得分:-1)

首先,您的示例1不是EER图(而是将其称为表格图)。要称为ER或EER图,您必须使用表示实体关系模型概念的符号(如Chen的符号),并将实体集与关系区分开来。在ER模型中,实体关系和关系关系都是使用表实现的,并且都不映射到FK约束,这只是一种完整性机制。许多人将ER模型混淆为旧的网络数据模型。

其次,识别关系与弱实体集一起使用,其中常规(父)实体集的主键构成弱(子)实体集的主键的一部分。当实体集由其自己的属性标识时,它是一个常规实体集。

要从弱实体关系中删除行,通常会通过其主键识别它。弱实体集通常具有复合主键,由其父键和附加弱键组成。弱密钥只需与父密钥一起唯一。例如,如果zonescities_id标识了name,您可以通过指定这些属性来删除区域:

DELETE FROM zones WHERE cities_id = 1 AND name = 'name';

如果您将复合主键声明为PK,则应自动对其进行索引并对其进行唯一约束。弱实体集的优点在于,在某些情况下,这种识别方法比引入无意义的代理键更自然。

拥有一个包含复合主键的表并不是一个好主意,该复合主键由唯一的代理ID和另一个属性(如其父ID)组成。如果没有正确执行唯一性,那么除了意外重复值的风险之外,它会不必要地使用简单代理PK的简单表格过于复杂。

您的WordPress图未说明弱实体集或识别关系(并且它不是EER图,如前所述)。你提到的每个表都有自己的代理键。请注意,ER模型中没有弱关系。