我有一张domains
表,每个域都属于一个contact
. 此外,您还可以分配 3 个contacts
具有不同角色的admin、tech和billing,这些不是强制性的。
我的第一个想法是在我的域表中添加三个额外的字段。
但后来我认为创建一个交集表更好。
有什么建议么?
我有一张domains
表,每个域都属于一个contact
. 此外,您还可以分配 3 个contacts
具有不同角色的admin、tech和billing,这些不是强制性的。
我的第一个想法是在我的域表中添加三个额外的字段。
但后来我认为创建一个交集表更好。
有什么建议么?
使用交集表是一种更简洁、更灵活的设计。
对于额外的列,您可以包含的实例数量有限(每个外键列一个)。此外,实例类型仅限于您的 FK 列给出的类型。进行任何更改都需要更改表设计。此外,由于您的角色是可选的,因此您的 FK 中可能有很多空值。拥有人烟稀少的专栏会让一些人误入歧途。这是一个真正的设计问题还是仅仅是“代码味道”是值得商榷的,取决于您实际填充表格的方式。
使用交集表,您可以使用约束来强制每个类型有一个实例,也可以允许每个类型有多个实例。如果您开始让联系人共享一个角色,这在将来可能会很有用。
此外,使用交集表,您可以创建新角色而无需更改表设计。这可以在将来为您节省大量工作。
在这两种方法中,您都会看到该表将收集所有列,其中一列的每一行总是有一些值,而对于剩余的列,您不知道该列值的频率,因为它们不是强制性的。
在这种情况下,我会根据其可用性概率将数据分开。
Table_1 = Domain_Owner --> DomainID, OwnerID
Table_2 = Domain_ExtraUser -->DominID,AdminID,TechID,BillingID
Table_3 = Contact --> ContactID
现在在上面的设计
Table2
中有同样的问题。正如@JoelBrown 提到的,当NULL
列的能力不确定时,在您进行一些测试之前,针对它们的查询的性能将是意想不到的。如果预计表格不会像数百万行那样庞大,您可以转换
Table_2
为键值对。TABLE_2 = Domain_ExtraUser --> DomainID ,ContactID