识别和 Non-Identifying 关系

Identifying and Non-Identifying relationship

首先,我已经阅读了几个类似的问题,"technical"答案看起来像C&P。我需要的是一个明确的例子。归一化为 3NF.

在这个项目中,在管理面板中,您必须创建城市和区域,每个区域都必须属于一个城市。还创建酒店并将它们分配到相应的区域,最后为每个特定的酒店创建别名,因为人们以不同的名字知道同一家酒店。 tables 酒店和 hotels_alias 将填写自动完成输入。

价格计算是根据服务(标准、私人和 VIP)根据区域和乘客数量和季节进行的,我仍然没有创建逻辑或 tables计算每名乘客和季节的价格。这就是为什么它们不在下图中的原因。

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

不过我有些疑惑。

Example 1

hotels_alias 不能没有 table 酒店,而没有区域 table 又不能存在酒店,而没有城市就不能存在。由于一个城市被划分为很多区域,酒店属于这些区域,区域是城市的一部分,酒店别名属于酒店,没有酒店就不可能存在。

到目前为止,很明显城市是一个强大的或 parent 个实体,而区域、酒店和 hotels_alias 是 child 个实体。

在EER图中你可以看到它有一个标识关系。第一个问题是:尽管 child 实体拥有自己的 ID 是否正确?这个 ID 是 PK、NN 和 AI?在某些示例中,这些 child 实体没有自己的 ID,因此它们的 PK 由来自相关 table 的两个 FK 形成,如 N:N (zones_has_servicees) 关系。

如果实际上 child table 不必拥有自己的 ID,因为他们必须能够通过 parent table 来识别自己,那么如何您可以更新或删除某个区域、酒店或酒店别名吗?

DELETE FROM zones WHERE name = 'name'

这是正确的吗?我应该为名称列创建索引吗?使用名称列而不是它自己的 ID 有什么优势(如果有的话)?一个childtable有自己的ID,用这个ID和它的parenttable的ID创建复合PK可以吗?这种类型的关系是否有任何作用,还是仅适用于像 InnoDB 这样的引擎?执行 ON DELETE CASCADE 操作?

如果我有两个同名的区域会怎样?例如:Hotel Zone,坎昆和图卢姆两个城市都有那个区域。进行删除将是 ?:

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

了解什么是 parent 和 child 实体然后是 WordPress 创建如下关系的原因,您可以看到它使用与 wp_postmeta 和 [= 的弱关系50=]。假设 wp_postmeta 不能没有 wp_posts,对吧?它对评论和用户也是如此。

WP EER

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

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

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

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

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

table 的复合主键由唯一代理 ID 和另一个属性(如其父 ID)组成,这不是一个好主意。如果没有正确执行唯一性,除了存在意外重复值的风险外,它还不必要地使简单的 table 与简单的代理 PK 变得过于复杂。

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