繁体   English   中英

在表之间建立一对一关系的理由

[英]Grounds for having a one to one relationship between tables

如果我有两种不同类型的用户,父母和子女。 他们有相同的领域,但是孩子与考试有一对多的关系,这是父母不存在的关系。

父母和孩子最好是作为单个表格建模,还是合并?

如果我有两种不同类型的用户,父母和孩子,该怎么办? 除了属于学校的孩子(学校有很多孩子)外,他们是一样的

父母和孩子最好是作为单个表格建模,还是合并?

父母和孩子都是毫无疑问的人。 你永远不应该把它们放在单独的表中。

只有时间将它们分开:如果一个孩子成为父母怎么办?

父母很容易生孩子,因为你需要一个关系表。 Als关系表是建立学校会员资格的正确方法。

所以这里的表格:

person
is_child_of (many to many, join table) --> relations between persons can be is_parent_of

干净利落

记住:做一个孩子是一个人与人之间的关系 如果需要,你会如何塑造孙子? 又一张桌子? 还有一个曾孙子?

并且你很好,并且你为很多“种类”的关系制作了很多桌子,突然之间你想要你必须添加一个字段(出生日期)或改变字段格式:你有在所有不同的表中执行此操作。

他们有相同的领域,但是一个孩子与考试有一对多的关系

即使字段相同,不同的约束1也意味着您正在处理逻辑上独立的实体。 如果没有其他因素,应将单独的实体放入单独的物理表中。

但是,可能有相反的理由。 例如,如果有一个密钥需要在父母子女的组合中是唯一的,或者有另一个表需要引用所有这些等等...

如果是这种情况,则逻辑上“父”和“子”都继承自“人”,包含公共约束(和字段)。 这种“继承”可以通过将整个层次结构存储到单个表中(并将未使用的“部分”设置为NULL),或者将所有三个“类”分成它们自己的表,并引用“基类”来表示。继承类“,例如2

在此输入图像描述

PERSON_ID在所有父母和孩子中都是独一无二的。 除此之外,OTHER_TABLE可以直接引用它,而不必单独引用PARENT_ID或CHILD_ID。


1在这种情况下的外键。

2一个非常简化的模型,它只是说明了上述要点,并没有尝试对您在问题中提到的所有内容进行建模

您在问题中描述了三个不同的实体 - “父母”,“儿童”和“考试”。 您已经展示了三者之间的关系如何不同。

从您问题中的所有内容,我会说您有三个实体,您应该在数据库中进行设置。 也就是说,父母和孩子应该有单独的表。

我会把孩子分成一个单独的表,原因很简单,父母可能有很多孩子(如果不是现在,也许将来可能)。

除了目前的需求之外,考虑将来可能发生的事情也很重要,即使它现在没有意义。 您可能有两个父级用户想要管理一个孩子和该孩子的考试。

考虑最可能的未来功能要求并考虑它们的程序。

如果项目在您的系统中以不同方式建模,我会说它们应该是不同的表格。 仅仅因为父母和孩子都具有相似的属性(姓名,年龄等),并不意味着他们将始终与数据库中的其他实体具有相同的关系。 您可以将父级和子级放在同一个表中,其中包含与父级相关的列,但这只会导致在尝试表示此关系时出现尴尬的自连接查询。 如果孩子有两个父母,这本身就会变得很奇怪。 所以对我来说你会有很多不同的表:

parent
child
child_to_parent (many-to-many join table)
school
child_to_school (one school to many children)
classes
child_to_classes (many-to-many)
classes_exams (one-to-many table relating exams to classes)
child_to_classes_exams (many-to-many table relating children to exams for specific classes)
* and maybe things like the following
teacher
teacher_to_classes (many-to-many)

现在肯定在你的类设计中(如果你正在使用OOP),你可以让一个普通的“人”类扩展子类和父类,它将处理设置公共属性的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM