Database design 对关系数据库中相同实体之间的多对多关系进行建模

Database design 对关系数据库中相同实体之间的多对多关系进行建模,database-design,relational-database,data-modeling,database-normalization,Database Design,Relational Database,Data Modeling,Database Normalization,当两个表具有多对多关系时,或者当一个表本身具有多对多关系时,我们可以使用连接表对此进行建模 但是,关系的类型可能超出原始类型,例如: 要求:我们有用户。每个用户可以有0个或更多其他用户作为朋友 解决方案:一个用户表和一个称为“user\u user”的连接表 然后我们发现了一个新的要求:有些友谊是浪漫的,或者换句话说,两个用户可以用不同于友谊的方式连接 解决方案a:在连接表中添加一列,其中包含友谊类型(朋友|伙伴|前朋友)等等 解决方案b:将“user_user”表重命名为“friendshi

当两个表具有多对多关系时,或者当一个表本身具有多对多关系时,我们可以使用连接表对此进行建模

但是,关系的类型可能超出原始类型,例如:

要求:我们有用户。每个用户可以有0个或更多其他用户作为朋友

解决方案:一个用户表和一个称为“user\u user”的连接表

然后我们发现了一个新的要求:有些友谊是浪漫的,或者换句话说,两个用户可以用不同于友谊的方式连接

  • 解决方案a:在连接表中添加一列,其中包含友谊类型(朋友|伙伴|前朋友)等等

  • 解决方案b:将“user_user”表重命名为“friendships”(用这种方法开始会更好),并创建一个名为romances的新表,同时将用户与用户连接起来

然后我们发现了另一个新的要求:用户可以欠其他用户钱。同样,我们可以在同一个连接表上进行复制,或者创建一个名为“debts”的新连接表。这一次我的直觉是100%有一个单独的表

每次我们发现新类型的关系或已知关系的子类型时,我们都可以向一个连接表中添加一列或创建一个新的连接表

我的问题是,什么是决定何时必须创建新表的好规则

是不是我们必须在每个订购的配对中拥有多于一行的数据?例如,如果过去的关系从未被删除,那么如果两个用户在过去两年中一直是朋友,失去联系,然后重新成为朋友,我们希望旧行也有一个开始和结束日期,但有两行会使另一列信息重复(旧行显示用户欠钱,新行不欠钱)

当额外的列在逻辑上不是单一关系类型的定义时,是吗

确定:友谊的开始日期与友谊1:1直接相关

不确定:一个用户拥有另一个用户多少钱的列可以是关系的1:1,但逻辑上不是友谊的描述


如果我们事先知道两个表将有很多多对多关系,这是计划多个连接表还是制作一个更灵活(即使连接类型不是任意的)的单一连接表的原因;DR表格表示应用程序/业务关系/关联。如实体关系模型中所示。关系。就像在关系模型中一样。每当我们对一个明显的关系感兴趣时,我们会考虑一个新的“结”/“关联”表。规范化告诉我们何时以及如何将关系/表分解为其他关系/表或将某些关系/表合并为一个关系/表


我们通过某个谓词(即语句模板)来识别关系,该谓词将一行转换为一个命题(即语句),表示我们对应用程序感兴趣的内容。从表的谓词生成true语句的行进入表中

Employee(e, n, ...) -- employee identified by E is named N and ...
Manages(e, m) -- employee M manages employee E
在不知道其谓词的情况下,您无法知道表对应用程序的说明或根据应用程序设置它!当你陈述一个“关系”的“基数”时,你必须首先确定你所谈论的关系/关联/谓词

(不幸的是,许多所谓的ER方法和产品使用“关系”来表示表的外键。)

我们可以将多个表合并到一个表中,或者在可以从新表重建原始表时用其他表替换一个表。在这里,我们可以将上面的表格组合成

-- employee identified by E is named N and ... AND employee M manages employee E
EmployeeM(e, n, ..., m)
这总是Employee&Manages的连接,因为连接的谓词是其参数的谓词的AND。但是因为E是公共列的集合&它在其中一个列中是唯一的,所以我们可以通过新列的投影来重建原始列

当一名员工只能有一名经理时,这将是一个合理的设计。但是,如果一个员工可以有一个或多个经理,那么该表(尽管它仍然包含满足该谓词的行并允许重构原始行)将显示更新异常,因此我们更喜欢原始行。如果一个员工可以有零个或一个或零个或多个经理,那么我们仍然可以使用该表,但不仅仅是该表,因为它不能告诉我们没有经理的员工。(原始设计就是这么做的。)我们还需要一个类似Employee的表,但是使用不同的谓词
E标识的Employee被命名为N,而。。。E没有管理者。
或者,我们可以使用类似EmployeeM的表来代替这两个表,但它允许通过不同的谓词为null,由E标识的employee被命名为N,而。。。和(employee M管理employee E或M为NULL,而E没有经理)

阅读原始Chen-ER模型/方法,其中有实体类型、图标和表格以及关系类型、图标和表格。每种关系类型都清楚地表示为菱形。每一行都清楚地表示实体类型(可能是关联实体类型)在关系类型中的参与,即清楚地表示表之间的FK。然而,许多所谓的ER方法甚至不区分实体和关系。(这不需要是好是坏,但他们的演示往往无法解释如何正确建模。)

关系模型本身并不关心实体和关系。它的表只是值的关系。ER和所谓的ER方法对实体和关系进行了不必要的、限制性的任意区分。当然,表仍然可以像在ER模型中一样说明它对应用程序的作用,因为值的子流程可以标识实体。看

正常化告诉你