Database 1:x关系而不是1:n关系

Database 1:x关系而不是1:n关系,database,database-design,relational-database,entity-relationship,Database,Database Design,Relational Database,Entity Relationship,我想知道在E-R数据模型中如何建立1:x关系模型,其中x不是“多”,而是一个固定的数字。一个简化的理论示例: 实体 房子 房间 房子和房间之间有一个1:n的关系,但是如果我们想补充一点,房子必须有一到八个房间呢 另一个人为设计的、更复杂且略有不同的示例: 实体 房子 房间 父母亲 孩子 关系 房子1:n房间 父1:n子 房子1:1父母-父母必须拥有一所房子,一所房子必须由一位父母拥有 我们如何增加以下内容:房子里的房间数量必须等于房子主人的孩子数量 谢谢。在数据库中,我们可以实现约束等规则 在S

我想知道在E-R数据模型中如何建立1:x关系模型,其中x不是“多”,而是一个固定的数字。一个简化的理论示例:

实体 房子 房间

房子和房间之间有一个1:n的关系,但是如果我们想补充一点,房子必须有一到八个房间呢

另一个人为设计的、更复杂且略有不同的示例:

实体 房子 房间 父母亲 孩子

关系 房子1:n房间 父1:n子 房子1:1父母-父母必须拥有一所房子,一所房子必须由一位父母拥有

我们如何增加以下内容:房子里的房间数量必须等于房子主人的孩子数量


谢谢。

在数据库中,我们可以实现约束等规则

在SQL中,规则的检查约束可能是:

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表和child表都应用了类似的约束,就不可能添加新的house表或child表,因为第一次插入会破坏该约束。一种可能的解决方法是暂时禁用约束。一些DBMS为此支持“延迟”(暂时禁用)约束的概念

在ER建模中,通常没有约束的标准符号。只有某些非常简单的规则可以用图表表示。更复杂的规则有时作为文本注释添加,或者完全从ER图中删除


如果能够对这些规则进行正式建模对您来说很重要,那么不要依赖ER图。使用对象角色建模、SBVR、RuleML和其他形式化方法等工具记录规则集。

在数据库中,我们可以将这些规则作为约束实现

在SQL中,规则的检查约束可能是:

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表和child表都应用了类似的约束,就不可能添加新的house表或child表,因为第一次插入会破坏该约束。一种可能的解决方法是暂时禁用约束。一些DBMS为此支持“延迟”(暂时禁用)约束的概念

在ER建模中,通常没有约束的标准符号。只有某些非常简单的规则可以用图表表示。更复杂的规则有时作为文本注释添加,或者完全从ER图中删除


如果能够对这些规则进行正式建模对您来说很重要,那么不要依赖ER图。使用诸如对象角色建模、SBVR、RuleML和其他形式化方法之类的工具来记录规则集。

也许您意识到这一点,但只是为了设置阶段:在关系数据库术语中,我们通常谈论的关系是1:1、1:M或M:M。它们的工作方式有根本的区别。1:1关系要求将外键发布到另一个表中的一个表。它可以在任何一张桌子上。1:M要求在指向1的“多”表中发布外键。M:M需要创建一个新表,关系表中的每个记录都有一个指向每个“主”表的指针

所以:如果你说,比如说,在我们的公寓楼里,每间套房都有4个房间,我们可能会说,这不是一般的1:M关系,而是更具体的1:4关系。但就如何在RDB中存储数据而言,我们将其存储为1:M。每个“房间记录”都有一个指向“套房记录”的指针。就DB结构而言,它仍然是1:M。我们可以在DB触发器或代码中添加约束,以强制要求数字必须始终正好为4,但这不会影响DB结构

在ERD上,这种约束很重要,一些DB设计人员将数字写在附加到DB实体的“多”符号旁边。如果必须正好有4,就写“4”

请注意,强制执行精确的数字或最小值可能很棘手。可以说,在现实生活中,每个人都有两个父母。这是我们数据库设计的另一个要求。这意味着我们不能添加“person”记录,除非我们同时添加他的父母。因此,要么数据输入屏幕上必须有关于此人本人及其父母的所有数据的字段,要么我们必须添加某种类型的虚拟记录,直到我们开始填写父母数据。在这个例子中,如果父母和这个人是相同的记录类型——比如说,如果我们制作一个家谱数据库——那么我们不能添加父母而不添加父母的父母,以及父母的父母的父母,并且。。。它会停在哪里?必须有一些规定来说明,我们只能追溯到很久以前,除此之外,我们现在不知道或者没有时间输入更多的数据,或者至少当我们谈到亚当和夏娃时,他们没有父母

我应该承认,在某些情况下,如果不仅有特定数量的相关记录,而且它们在某种程度上也是不同的,我们可能会为每个记录创建单独的指针。例如,我们可以说每个人都有一个母亲和一个父亲,即两个1:1的关系,而不是说每个人都有两个父母,即一对1的关系,M=2。就我个人而言,我很少这样做,因为这通常会使查询和索引更加困难。我们不需要通过查看父母id来获取双亲,而需要同时检查母亲id和父亲id