【问题标题】:Modelisation of relational data关系数据的建模
【发布时间】:2017-06-18 18:07:21
【问题描述】:
我是 Web 开发的新手,我想请更有经验的开发人员提供建议。
我必须建模一个基本的关系系统。
我有 3 种类型的数据。
用户
设计
项目
USERS 有 0 - N 个 DESIGNS
USERS 有 0 - N 个 PROJECTS
PROJECTS 有 1 - 1 个 USERS
PROJECTS 有 1 - N 个 DESIGNS
基本上USER可以有一个DESIGN和PROJECTS的列表。
并且用户会将一个DESIGN与一个PROJECT相关联。
我的问题是:如果用户想要删除 DESIGN,会发生什么?
它基本上会从列表中删除设计,
但是如果一个项目与相同的设计有关系会发生什么?
【问题讨论】:
标签:
database
database-design
relational-database
relationship
【解决方案1】:
“有”没有任何意义。您必须告诉我们关系是什么,这些关系涉及表示实体及其属性的值。例如,对于具有用户 U 和项目 P 的属性/列的关系/表,如何它们是相关的,即表中的行。用户 U 在项目 P 上工作?用户 U 厌恶项目 P?项目 P 上的用户不允许在设计 D 上工作?项目 P 的用户被允许从事设计 D 的工作吗?您必须清楚地表明,更新数据库的人可以获取可能进入表中的每一个可能的行,并能够通过查看当前的业务情况来判断它是否 /em> 进入表格。
这就是更新和查询数据库所需的全部知识。更新者查看当前情况并保留包含根据每个关系相关的值行的表。
鉴于关系是什么以及会出现什么情况,通常只会出现某些表格值的组合。例如,如果一个表包含“项目 P 产生设计 D”的行,并且设计仅由一个项目产生,那么表中将只有一行具有给定的 D 值。然而,如果一个设计可以由多个项目产生,那么情况就不是这样了。例如,如果“项目 P 产生设计 D”总是暗示“D 是设计”,那么如果您“想从第二个表中删除设计”d,那么您还必须删除行看起来像第一个表中的 (P, d)。如果没有同时要求删除它们,那将是一个错误。而如果第二个表用于“设计 D 很愚蠢”,那么从中删除设计可能与其他表无关。但请记住,您不需要知道更新和查询的约束。
我们编写约束来告诉 DBMS 拒绝因为错误而无法更新数据库状态的请求。例如,在上述情况下,一个 PRIMARY KEY 或 UNIQUE 约束表示每一行都有一个唯一的 D 值。基数只是关于关系的一些信息,经过识别后,我们可以告诉 DBMS 对表值可能出现的对的限制。例如,一个 FOREIGN KEY 约束表示上面“第一个”表中的每个 D 都必须在“第二个”表中显示为 D。但请记住,限制来自于了解关系是什么以及会出现什么情况。
此外,由于我们经常要同时更新涉及 FOREIGN KEY 约束的多个表,SQL DBMS 允许将 CASCADE 与它们关联。这使我们能够简洁和声明性地表达这样的事情,如果引用的行被删除,那么所有引用的行也应该被删除。