【发布时间】:2021-07-21 01:35:36
【问题描述】:
(编辑于 1/5 10:22hr。添加了一些关于我的符号的解释。并添加了一些我收到的额外信息)
我正在上一门数据库设计课程,目前我们正在 MySQL 工作台中进行 ERD 和设计数据库。考虑第一个、第二个和第三个 NF,创建模式、表、约束等。 大部分我都很清楚。
但是有一个方面尚不清楚:X:X 到 1:many 关系与 X:X 到 0:many > 关系(意思是:无论到 0:many,还是到 1:many,等等)。 在某些情况下很明显,在其他情况下则不是那么明显。每当我不清楚时,它大多是这样的:
示例: 一位艺术家有 1 到多幅画作。一幅画有 1 位艺术家,而且只有 1 位艺术家。
关系:
|艺术家| 1:1 -------- 1:many |绘画|
在另一个符号中相同 |艺术家| ||------------ 1
这看起来很公平,但是....然后有一个想法:我可以成为一个新艺术家,还没有画出一幅画。 或者:我可能正在将一位新艺术家输入到艺术家表中,但尚未输入他的画作(这可能会导致实际问题)。
另一个例子: 一个研讨会有 1 到多个参与者。参与者进入 0 对多研讨会。
关系:
|车间| many:0 ------- 1:many |参与者|
好的。但是:一个研讨会可能有 0 名参与者(没有人想参加,可能会导致取消)。 或者:我可能正在进入一个新的研讨会到一个表中,还没有添加任何参与者。
另一个例子: 活动仅在 1 个地点举行。一个位置有 1 到多个事件。
关系:|事件|多:1 -------- 1:1 |位置|
但是,也许您正在进入一个新的(未来)地点,但那里还没有活动。
长短短:在上述情况下,我很难确定最小基数。
另外,当我设计一个数据库并让 Workbench 对用于创建表的 SQL 进行正向工程时(基于我的 ERD),X 与 1/many 之间似乎没有任何区别与 X 到 0/许多变体相比。这让我想知道:做一个或另一个的实际(实际)效果或含义是什么?也许这些影响(在未来的道路上)会让选择变得更容易?
谁能用一种简单(万无一失)的方式解释这个问题?
期待理解!
加法 1/5:
我已经和老师讨论过我的问题/问题。他同意我的观点,即某些最小基数可能会导致僵局:
一个表不能在另一个表中没有出现的情况下插入,反之亦然。
他向我解释说,ERD 图是一个逻辑模型,而不是一个物理模型。换句话说,ERD 的最小基数对于技术实现来说并不是必需的。
好吧,如果是这样的话,我理解他的意思。通常一个艺术家至少有一幅画。研讨会通常至少有一名参与者。一个位置通常至少有一个事件。所以在逻辑层面上,这似乎很好。
在技术/实施层面,这是另一回事。您应该能够输入艺术家、工作室或地点,而不会在另一个表中出现事件。
我现在的问题是:
- 这是真的吗? ERD 是逻辑模型,而不是技术模型?
- 如果是这样,添加最小基数的原因是什么?好像没什么用。
【问题讨论】:
-
关系中的许多可以为 0。在 mysql 中,您不能通过 FK(代表关系)强制父立即具有至少 1 个子 - 这只能通过应用程序逻辑来完成。从实际的 RDBM 的角度来看,要求父母立即生孩子是一个先有鸡还是先有蛋的问题(您需要先创建父记录,以便知道您在子记录中设置的 PK)。这通常用于处理应用程序逻辑和事务。
-
艺术家不一定有画。这些画可能没有记录在数据库中,或者他们可能从来没有画过任何东西,只有照片或舞蹈套路。
-
我能想到的强制至少 1 个关系的最简单方法是建立
primary关系。获取一个包含person、address的数据库和一个链接这两个person_address的表。person或address都不是指另一个,只有链接表可以这样做。因此,您有一个 0-many : 0-many 关系。但是,如果您将primary_address_id列添加到person表中,您可以强制在首先创建其主要地址之前不能创建一个人并且该人是使用该地址创建的,从而强制执行最小值一。这很不寻常。 -
那么,如果我理解正确的话,没有办法强制在 FK 关系中至少出现 1 次?
标签: mysql sql database-design schema mysql-workbench