我对数据库设计比较陌生,因此我决定制作自己的假设数据库进行练习。但是,我在建模和规范化它时遇到了麻烦,因为我认为存在许多多对多 (M:N) 关系。
一般场景描述
该数据库旨在保留有关从事塞尔达系列工作的各种人员的数据。我想跟踪可以玩游戏的控制台、参与游戏开发的员工、员工的工作(许多员工在多个游戏中从事不同的工作)等。
商业规则
- 多个员工可以在多个游戏上工作。
- 多个游戏可以在同一个控制台上。
- 多个控制台可以是同一个游戏的平台。
- 多个员工可以拥有相同的Job。
- 一个Employee可以有多个Jobs。
- 一个游戏可以有多个员工。
- 一个游戏在它的开发中可以有多种类型的工作
- 多个游戏可以附加相同类型的作业。
- 一个控制台可以有多个人在上面工作。
- 一个人可以在多个控制台上工作。
属性名称和示例值
- Employee Name,可以分为First和Last(例如 “John” 和 “Doe” )
- 游戏名称(例如“时之笛”)
- 职位名称(例如“关卡设计”、“总监”、“沉着”、“关卡设计师”、“程序员”、“本地化”等)。
- 控制台名称(例如“Game Boy Advance”)
问题
到目前为止,似乎无论我设计什么,在所有感兴趣的实体类型之间都存在数据冗余和 M:N 关系。但是我觉得数据库设计者一定会经常遇到这种问题,所以一定有解决的办法。
注意:我很能够找到填充表格的数据,问题是将其组织到一个带有标准化表格的数据库中。
是的,多对多(简称 M:N)关联或关系的识别是数据库从业人员在布置概念模式时经常面临的情况。所述基数比的关联出现在性质非常不同的商业环境中,并且当通过例如SQL-DDL安排在逻辑级别上适当地表示时,它们不会引入有害的冗余。
这样,数据库建模练习的目标应该是高精度地反映感兴趣的业务上下文的相关特征;因此,如果您正确地识别出有许多 M:N 关联,那么您必须在 (a) 概念模式和 (b) 相应的逻辑级声明中表达它们,无论它们有多少连接 - 或任何其他——必须解决基数比。
商业规则
您提供了一个上下文相关的问题,并且还澄清了您正在处理的数据库纯粹是假设的,这是很重要的一点,因为我认为像正在考虑的那样的“现实世界”业务场景会更加广泛因此,这意味着更复杂的信息需求。
我决定 (1) 对您提供的业务规则进行一些修改和扩展,以便 (2) 产生更具描述性的概念模式——尽管仍然是假设性的——。以下是我整理的一些配方:
1 Party是法律上下文中使用的术语,指的是组成单个实体的个人或一组个人,因此该名称适用于代表人和组织。
IDEF1X 图
随后,我创建了如图 1所示的 IDEF1X 2图表(确保单击链接以更高分辨率查看它),将上面介绍的业务规则(以及其他一些似乎相关的规则)合并到一个图形设备中:
2 信息建模集成定义( IDEF1X ) 是一种高度推荐的数据建模技术,于 1993 年 12 月由美国国家标准与技术研究院(NIST)确立为标准。它基于 (a) 由关系模型的唯一创始人,即 EF Codd 博士撰写的早期理论材料;关于 (b) 数据的实体关系视图,由PP Chen 博士开发;以及 (c) Robert G. Brown 创建的逻辑数据库设计技术。
如您所见,我仅通过相应的关联实体类型描述了三个 M:N 关联,即:
除其他方面外,还有两种不同的超型-亚型结构,其中:
Person和Organization是Party的互斥实体子类型,它们的实体超类型
Product是System和Game的超类型,它们又是互斥的子类型
如果您不熟悉超类型-子类型关联,您可能会找到帮助,例如,我对以下问题的回答:
说明性逻辑 SQL-DDL 布局
接下来,我们必须确保在逻辑层面:
所以我根据之前展示的IDEF1X图声明了以下DDL安排:
值得强调的是,在多个表中声明了复合PRIMARY KEY 约束,它们代表概念实体类型之间发生的连接层次结构,这种排列对于数据检索非常有益,例如,表达 SELECT包含 JOIN 子句以获取派生表的操作。
是的,(i) 每个 M:N 关联和 (ii) 每个关联的实体类型都由 (iii) 逻辑 DDL 结构中的相应表表示,因此要特别注意 PRIMARY 和 FOREIGN KEY 约束(以及我作为评论留下的注释)代表这些概念元素的表格,因为它们有助于确保相关行之间的连接符合适用的基数比。
The usage of composite keys was introduced by Dr. E. F. Codd from the very origin of the relational paradigm, as demonstrated in the examples he included in his 1970 seminal paper entitled A Relational Model for Large Shared Data Banks (which, precisely, also presents the most elegant method to handle conceptual M:N associations).
I put up a db<>fiddle and a SQL Fiddle, both running on Microsoft SQL Server 2014, so that the structure can be tested “in action”.
Normalization
Normalization is a logical-level procedure that implies, basically speaking:
Eliminating non-atomic columns via first normal form so that data manipulation and constriction are much easier to cope with by the data sublanguage of use (e.g., SQL).
Getting rid of undesirable dependencies among the columns of a specific table by virtue of the successive normal forms to avoid update anomalies.
Naturally, one has to take into account the meaning carried by the table(s) and column(s) at issue.
I like to think of normalization as a test founded on science that a designer applies to the pertinent elements once he or she has delineated a stable logical-level arrangement in order to determine whether its items comply with every one of the normal forms or not. Then, if needed, the designer takes the appropriate correcting measures.
Redundancy
In the relational model, while duplication of values contained in columns is not only acceptable but expected, duplicate rows are forbidden. To that extent, as far as I can see, duplicate rows and other kinds of harmful redundancies are prevented in all the tables comprised in the logical layout exposed before, perhaps you would like to clarify your concern in this regard.
Anyway, you can certainly (a) evaluate on your own said structure by dint of the normal forms to define if it meets the requirements and (b) modify it if necessary.
Related resources
Ternary associations
There is another important aspect that you brought up via comments (posted in an now-deleted answer):
That circumstance seems to indicate that one of your concerns has to do with conceptual ternary associations. Basically speaking, this sort of associations comes about when there exists (1) a relationship involving (2) two other relationships, in other words “a relationship between relationships” —a typical situation too, since a relationship is an entity in its own right—.
如果管理得当,这些安排也不会带来有害的裁员。而且,是的,如果在某个用例中,您确定此类关系在“现实世界”实体类型中出现,您必须 (i) 建模并 (ii) 在逻辑级别准确地声明它们。