我很好奇你们如何创建表来维护完整性?
tblUserProfile
UserId
EyeColorId
HairColorId
RelationShipStatusId
等
像EyeColorId这些值中的每一个都有一组值,如棕色,黑色,黄色,绿色。相似的HairColorId有黑色,金色,深红色等,而RelationShipStatusId有离婚,已婚,单身等等。我应该为每一个创建不同的表吗?喜欢
tblEyeColor
EyeColorId
EyeColorCode
然后: -
tblHairColor
HairColorId
HairColorCode
同样继续创建表格?有很多这样的表(大约20-25)。如果我继续创建这些表并加入它们,那将极大地降低我的性能。你们如何保持这种枚举值?我应该保持检查约束还是应该继续制作表格?
答案 0 :(得分:4)
我会说Color看起来像是一张桌子,头发和眼睛都可以使用。对于你的诚信来说,执行没有人应该有金发眼睛或蓝色头发的事实有多重要?
有些人会想到一个查找表,它会有一个id,一个组和一个值,也许每行都有一个描述。 id和group将是主键,所以你的头发为id = 1和group = 1为BLONDE头发颜色,id为1,组为= 2,眼睛为HAZEL眼睛颜色等
其他人会认为这是一种糟糕的非规范化设计。
只有当特定查询的数量变大时,联接才会减慢速度。
我的建议是做一个标准化设计,直到你有一些数据表明它表现不佳。当发生这种情况时,请对您的应用进行分析,以找出问题所在,并进行适当的重构或反规范化。
我想说索引会比这些JOIN对您的表现产生更大的影响。如果没有数据支持,你可能会对过早优化感到内疚。
答案 1 :(得分:2)
如果选项数量为fixed
,则无需创建表格。您可以在表格中使用Enum
类型。
例如列EyeColor
将为Black, Brown, Blue
然而,我从未见过有绿眼睛的人。 LOL
答案 2 :(得分:1)
这是传统方法,是的。
大多数现代RDBMS会长时间缓存像这些查找这样的小表,这可以缓解潜在的多连接问题。
此外,您可以在应用程序中预加载所有查找表,并在访问数据库之前将枚举反向转换为代码中的ID。这样您就不需要在查询中加入。