如何保持诚信?

时间:2010-07-02 16:59:38

标签: rdbms

我很好奇你们如何创建表来维护完整性?

tblUserProfile

UserId
EyeColorId
HairColorId
RelationShipStatusId

像EyeColorId这些值中的每一个都有一组值,如棕色,黑色,黄色,绿色。相似的HairColorId有黑色,金色,深红色等,而RelationShipStatusId有离婚,已婚,单身等等。我应该为每一个创建不同的表吗?喜欢

tblEyeColor

EyeColorId
EyeColorCode

然后: -

tblHairColor

HairColorId
HairColorCode

同样继续创建表格?有很多这样的表(大约20-25)。如果我继续创建这些表并加入它们,那将极大地降低我的性能。你们如何保持这种枚举值?我应该保持检查约束还是应该继续制作表格?

3 个答案:

答案 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。这样您就不需要在查询中加入。

相关问题