我目前有一个数据库,里面有学生表:
Students
_________
StudentID PK
FirstName
LastName
BirthDate
AddressL1
AddressL2
City
State
Zip
etc.....
我的客户要求我添加一项功能,以便识别系统中的兄弟姐妹。如果Jimmy是学生,Billy是学生而Jimmy和Billy是兄弟,她想知道这一点。
你会如何实现这个?
我在考虑添加一个带有FamilyID FK的Family Table对于这个问题来说太过分了。你同意吗?
我的直觉是添加一个名为 Family 的可为空的列。如果学生没有兄弟姐妹,请将其设置为null。如果学生有兄弟姐妹,每个学生都会获得存储在家庭列中的相同GUID。
如果您想列出您执行的给定学生的兄弟姐妹: 选择兄弟姐妹。* 来自学生 内部联接 学生作为兄弟姐妹 上 Students.Family =兄弟姐妹。家庭 哪里 Students.StudentID =?
这种方法的缺点是什么?我应该考虑另一种策略吗?
答案 0 :(得分:2)
我认为对兄弟关系存储的需求是一个边缘用例,因此在表达这种情况的无限可能性中,我建议一个对您现有模型的侵害最小的一个肯定适合更常见的需求:
添加包含“家庭ID”和“学生ID”的“家庭”表格。 学生ID是引用“学生”表的外键。 这两个字段是复合主键。
当两名学生成为兄弟姐妹时,从序列中创建一个新的家庭ID,并将两行学生ID和这个新的家庭ID添加到“家庭”表中。
有些人可能会建议将家庭表中的“地址”或“母亲姓名”等字段规范化,但相信我,家庭会比你想象的更复杂: - )