我想知道如何在E-R数据模型中建模1:x关系,其中x不是'很多',而是固定数字。一个简化的理论例子:
实体 屋 ROOM
HOUSE和ROOM之间有一个1:n的关系,但是如果我们想要添加一个房子必须有一到八个房间呢。
另一个人为的,更复杂,略有不同的例子:
实体 屋 房间 家长 CHILD
关系 房子1:n房间 父母1:孩子 房子1:1父母 - 父母必须拥有一个房子,房子必须由一个父母拥有
我们如何添加以下内容:房屋的房间数量必须等于房屋所有者的儿童数量?
感谢。
答案 0 :(得分:1)
在数据库中,我们可以实现 constraints 等规则。
在SQL中,规则的CHECK约束可能是:
CHECK NOT EXISTS
(
SELECT MAX(house.owner) parent, COUNT(*) cnt
FROM house, room
WHERE house.house_id = room.house_id
GROUP BY house_id
EXCEPT
SELECT parent, COUNT(*) cnt
FROM child
GROUP BY parent
)
这是ISO标准SQL,但并非所有SQL DBMS都支持将子查询置于约束中的能力。这种约束通常只适用于其中一个表。 SQL DBMS通常只允许一次插入一个表,因此如果您对house 和子表应用类似的约束,则无法添加新的房屋或子节点,因为约束将被第一次插入。可能的解决方法是暂时禁用约束。一些DBMS为此目的支持“延迟”(临时禁用)约束的概念。
在ER建模中,通常没有标准的约束表示法。只能以图解方式表示某些非常简单的规则。有时会将更复杂的规则添加为文本注释或完全省略ER图。
如果您能够正式对这些规则进行建模,那么请不要依赖ER图表。使用对象角色建模,SBVR,RuleML等工具来记录规则集。
答案 1 :(得分:0)
也许你意识到这一点,但只是为了设定阶段:在关系数据库术语中,我们通常谈论的关系是1:1,1:M或M:M。它们的工作方式存在根本区别。 1:1关系需要将外键发布到另一个表中的一个表。它可以在任何一个表中。 1:M需要在"很多"中发布外键。指向那个的表。 A M:M需要创建一个新表,关系表中的每个记录都有一个指向每个" main"表。
所以:如果你说我们的公寓大楼每间套房总共有4个房间,我们可能会说这不是一般的1:M关系,而是更具体的1:4。但就我们如何将数据存储在RDB中而言,我们将其存储为1:M。每个"房间记录"有一个指向"套件记录的指针"。就DB结构而言,它仍然是1:M。我们可以在数据库触发器或代码中添加约束来强制数字必须始终精确为4,但这不会影响数据库结构。
在ERD上,这种约束很重要,一些数据库设计师会在"很多"旁边写下数字。附加到数据库实体的符号。喜欢写" 4"如果必须有4个。
请注意,强制执行确切的数字或最小值可能会非常棘手。在现实生活中,每个人都有两个父母,这是一回事。将此作为我们数据库设计的要求是另一回事。这意味着我们无法添加人员#34;记录,除非我们同时添加他的父母。因此,数据输入屏幕必须包含关于此人以及他父母的所有数据的字段,或者我们必须添加某种虚拟记录,直到我们填写父数据。在这个例子中,如果父母与该人的记录类型相同 - 如果我们正在创建家谱数据库,那么我们就不能在不添加父母的情况下添加父母。父母和父母'父母'父母,......它会停在哪里?必须有一些条款说我们只能追溯到目前为止,除此之外,我们现在还不知道或没有时间输入更多数据,或者至少当我们到达亚当和夏娃时,他们没有父母。
我应该承认,在某些情况下,如果不仅有特定数量的相关记录,而且它们在某种程度上也是不同的,我们可能会为每个记录创建单独的指针。例如,不是说每个人有两个父母,即M = 2的1:M关系,我们可以说每个人有一个母亲和一个父亲,即两个1:1的关系。就个人而言,我很少这样做,因为它通常会使查询和索引更加困难。我们不必通过查看parent_id来获取父母,而是检查mother_id和father_id。如果我们想索引一个,我们可能想要索引另一个。如果数字大于2或3,因此查询必须检查许多指针字段,程序员很容易想念你,例如检查指针1,2,3,5和6但是忘记包括4.如果有一天我们决定最大值不再是6而是7,那么现在每个查询都必须更新以添加对指针#7的检查,如果有很多查询,有人会错过一个,并且这将是一个棘手的错误,因为只要记录只有6而不是7等,一切都会有效。
BTW约束,例如"房间数量必须等于拥有儿童的数量"很棘手我猜你是一个例子,你只是弥补了你的头脑,但它是那种在你设置时很容易陷入困境的陷阱具体数字。也许在你的家庭中,每个孩子都有自己的卧室,但在很多家庭中,孩子们必须共用一个房间。或者在另一个方向,很多家庭都有备用卧室,供客人使用。我记得多年前在医疗保险系统上工作,他们为每个家庭建造了8个孩子的限制,因为有人认为,谁会有8个以上的孩子?但是当然有些家庭有超过8个孩子,当我们有一个孩子时,系统就失败了。