Jak*_*ake 3 normalization database-design
我的数据库以以下方式存储有关人员的信息。有一个Person
包含常见个人信息字段的 表格;姓名、出生日期、性别等。
每个人的联系信息以ContactInformation
1:1 的关系保存在表中。
最后,我们存储数据的组织中每种特定类型的人都有单独的表,与 Person
我的Student
桌子有点问题。基本上,我的客户现在想要存储学生的家庭住址和学期地址。但我不确定如何处理这个问题。
我看到三种可能的选择/解决方案:
ContactAddressMapping
在Person
和之间创建连接表(例如)ContactInformation
。TermTimeAddress
与 1:1 关系的表Student
Student
表中添加额外字段以保存术语时间地址。现在这里是我看到的每个选项的主要“问题”:
联结表将允许为一个人存储多个地址,但我们只需要为学生(现在)这样做。如果不使用某种布尔字段,则也无法确定哪个地址是家庭/学期时间地址,该字段在该表中似乎是毫无意义的信息,因为它仅对学生而言是唯一的。
创建一个新表将术语时间地址与主要地址分开,但这些感觉像是重复,因为我基本上是在创建具有相同字段的特定类型的地址,减去电话号码和电子邮件地址等内容。
将字段添加到Student
似乎我用应该在其他地方的信息把表格弄得乱七八糟。该表格应仅用于提供有关该学生的信息,例如他们的学校、学习领域以及安置的开始和结束日期。
其中哪一个是最合适的选择,或者还有其他我还没有见过的解决方案吗?
无论如何,我不会将 ContactInformation 与 Person 一对一链接;在 ContactInformation 中存储多个地址违反了正常形式。相反,我将 ContactInformation 与它自己的 PK,PersonID 的 FK 返回到 Person 表,并根据需要为每个 Person 存储尽可能多的联系人。
CREATE TABLE ContactInformation (
ContactID int IDENTITY(1,1) PRIMARY KEY,
PersonID int FOREIGN KEY REFERENCES Person(id),
ContactInfo nvarchar(250),
ContactType char(2)
)
Run Code Online (Sandbox Code Playgroud)
用 PersonID 填充 ContactInformation 表,然后是电子邮件地址/电话号码/邮寄地址/twitter 句柄等,并用 ContactType 标记它。这可能是邮寄地址的“MA”,电子邮件的“EM”,Twitter 的“TW”,学期时间的“TT”,如您的问题。
触发器可以验证任何插入,以确保联系人没有 TT(学期时间)地址,除非他们是学生。
希望能帮助你跳出框框思考。如果您已经深入了解应用程序,此时进行这些更改可能太难了。
编辑:我觉得我没有正确回答你的直接问题。如果我是你并且此时无法或不可行进行更深入的更改,我会将 TermTime 地址添加到 Students 表中。
它属于那里,因为 1) 它只适用于学生,因此将它放在 Person 或 Contact 表(因为它们现在存在)中不太理想,并且 2) 每个学生都应该有一个,所以它已经是他们学生记录的一部分和 3 ) 这可以在对现有架构的破坏最小的情况下完成。