要“查表”还是没有?

时间:2008-12-18 02:05:12

标签: database-design normalization

我目前正在为项目设计数据库。现在,我正在与自己辩论是否必须创建一个查找表,例如“民用状态”数据,该数据只能包含固定值,如Single,Married,Separated,Widow / Widower。我很确定将来不会添加任何其他值。我应该将它们放在一个单独的表上,还是只对程序代码上的值进行硬编码?

6 个答案:

答案 0 :(得分:7)

对它们进行硬编码有什么好处?鉴于现代ORM系统,从DB中读取这些值并使用它们是不是很容易?如果是这样,那么当缺点是,我没有看到硬编码的好处:

  • 如果要添加到列表中,则必须重新部署
  • 如果要更改拼写,则必须重新部署
  • 您可能希望拥有的不仅仅是字符串(可能是ref-id,还是工具提示文本等)。
  • 如果您不存储ref-id,则必须更改1000条记录才能更改存储的文本。

“我不能认为他们会改变”几乎永远不会与“他们无法改变”相同。如果他们无法更改,如True / False,那么很好。如果你不他们会改变,而不是改变。

答案 1 :(得分:3)

规范化说:查找表

常识说:查找表

“民事联盟”的概念不是自然法,而是民法问题 - 而且可以改变。

如果您需要根据计划中的民事工会身份做一些事情,Andrew Kennan的方法很好。否则,仅查找表就足够了

答案 2 :(得分:1)

根据您的编程语言,将它们设为常量或枚举。没有理由把它们放在数据库中,因为就像你说的那样,它们可能不会改变。

如果进入数据库,下一步是什么?男/女?真假? :)

我主要使用Java,所有这些项目都是枚举。我们的数据库是MySQL,然后我们也将列类型创建为枚举。尼斯甚至在那里比赛。

HTH

答案 3 :(得分:1)

您的表中应该有一个CivilStatus(int)列,它是CivilStatuses表的外键引用,其中包含所有可能的民用状态。

即使你不希望它改变,我仍然会从数据库中查询它。这将使其他事情在未来更容易,如本地化/全球化。

然后,您可以在代码中使用枚举,正如其他人所说的那样,可以使映射更容易。但是,无论何时向用户显示文本,都必须来自数据库或资源文件 - 而不是直接来自代码。

答案 4 :(得分:0)

我倾向于两者兼而有之 - 使用查找表来强制引用完整性并提供枚举以使代码可读。

缺点是如果由于某种原因,查找值确实发生了变化,您需要记住更新这两个位置。

答案 5 :(得分:0)

查找表。为什么呢?

1)实施数据完整性。至少对列进行检查约束。

2)本地化

3)查询问题。有时数据库区分大小写。

Select * from People where MarriageStatus = "single" or is it "Single", or is it "SINGLE"
嗯,我不知道我最好把ToLower(MarriageStatus)=“单身”。 糟糕,我不知道在列周围包装函数会阻止它使用索引:)

省去一些麻烦并使用查找表,除非这是一个预期寿命较短的小项目。