0

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

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

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

我发现一个很好的解释是 识别和非识别关系有什么区别?

不过我有一些疑问。

示例 1

Hotels_alias 没有表就不能存在,而酒店又不能没有区域表而存在,而这又不存在于没有城市的情况下。由于一个城市被划分为许多区域,酒店属于这些区域,区域是城市的一部分,酒店别名属于酒店,如果没有酒店,则无法存在。

到目前为止,很明显 city 是一个强大的或父实体,而 zone、hotels 和 hotels_alias 是子实体。

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

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

DELETE FROM zones WHERE name = 'name'

这个对吗?我应该为名称列创建索引吗?如果有的话,名称列而不是它自己的 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

4

1 回答 1

-1

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

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

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

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

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

拥有一个由唯一代理 ID 和另一个属性(如其父 ID)组成的复合主键的表不是一个好主意。如果没有正确执行唯一性,除了存在意外重复值的风险之外,它还不必要地过度复杂化原本具有简单代理 PK 的简单表。

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

于 2017-10-22T22:12:46.283 回答