Database design 对关系数据库中相同实体之间的多对多关系进行建模
当两个表具有多对多关系时,或者当一个表本身具有多对多关系时,我们可以使用连接表对此进行建模 但是,关系的类型可能超出原始类型,例如: 要求:我们有用户。每个用户可以有0个或更多其他用户作为朋友 解决方案:一个用户表和一个称为“user\u user”的连接表 然后我们发现了一个新的要求:有些友谊是浪漫的,或者换句话说,两个用户可以用不同于友谊的方式连接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
- 解决方案a:在连接表中添加一列,其中包含友谊类型(朋友|伙伴|前朋友)等等
- 解决方案b:将“user_user”表重命名为“friendships”(用这种方法开始会更好),并创建一个名为romances的新表,同时将用户与用户连接起来
如果我们事先知道两个表将有很多多对多关系,这是计划多个连接表还是制作一个更灵活(即使连接类型不是任意的)的单一连接表的原因;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模型中一样说明它对应用程序的作用,因为值的子流程可以标识实体。看
正常化告诉你