sql - 识别数据库中的 sibling

标签 sql database-design

我目前有一个包含学生表的数据库,如下所示:

 Students
 _________
 StudentID PK
 FirstName
 LastName
 BirthDate
 AddressL1
 AddressL2
 City
 State
 Zip
 etc.....

我的客户要求我添加一项功能,以便她可以识别系统中的 sibling 。如果 Jimmy 是学生,Billy 是学生,Jimmy 和 Billy 是兄弟,她想要一种方式来了解这一点。

您将如何实现?

我认为添加一个带有 FamilyID FK 的族表对于这个问题来说是多余的。你同意吗?

我的直觉是添加一个名为Family 的可为空的列。如果学生没有 sibling ,则将其设置为 null。如果该学生有 sibling ,则每个学生都会获得存储在 Family 列中的相同 GUID。

如果你想列出给定学生的 sibling ,你会执行: 选择 sibling 。* 来自学生 内部联接 作为 sibling 的学生 在 学生.家庭 = sibling .家庭 在哪里 Students.StudentID = ?

这种方法有什么缺点?我应该考虑其他策略吗?

最佳答案

我假设对兄弟关系存储的需求是一个边缘用例,因此出于表示这一点的无限可能性,我将提出一个对您现有模型的侵犯最少的肯定适合更常见需求的模型:

添加带有家庭 ID 和学生 ID 的“家庭”表。 学生 ID 是引用“学生”表的外键。 这两个字段一起是复合主键。

当两个学生原来是 sibling 时,从一个序列中创建一个新的家庭 ID,并将包含两个学生 ID 和这个新家庭 ID 的两行添加到“家庭”表。

有些人可能会建议将“地址”或“母亲姓名”等字段规范化到家庭表中,但请相信我,家庭比您想象的要复杂得多:-)

关于sql - 识别数据库中的 sibling ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809421/

相关文章:

mysql - 不使用聚合函数从一张表中减少一行中的多个记录

mysql - 单独的表格供引用还是我应该使用一张表格?

sql - 优化大型表上的 SQL 连接

database-design - 数据库设计问题-存储国际人士的姓名

php - OO设计问题(使用Symfony2)

mysql - 用户拥有/管理其他用户

mysql - Sql where 带有一个负数和两个正数

sql - 子查询返回超过 1 个值

mysql - 从任务数据库设计中赚取xp点

mysql - 使用两个相似的表或标志进行多对多关系