3

我目前正在为一个项目设计一个数据库。现在我正在和自己争论是否必须创建一个查找表,例如“公民身份”数据,它只能包含固定值,如单身、已婚、分居、寡妇/鳏夫。我很确定将来不会添加其他值。我应该把这些放在一个单独的表上还是只是硬编码程序代码上的值?

4

6 回答 6

7

对它们进行硬编码有什么好处?给定一个现代的 ORM 系统,从数据库中读取这些值并使用它们不是很容易吗?如果是这样,那么当缺点是:

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

“我不认为他们会改变”与“他们不能改变”几乎不一样。如果他们不能改变,如真/假,那么很好。如果你不认为他们会改变,也不会改变那么多。

于 2008-12-18T02:09:47.663 回答
3

规范化说:查找表

常识说:查找表

"公民结合"的概念不是自然法,而是民法问题——而且可以改变。

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

于 2008-12-18T02:15:56.120 回答
1

根据您的编程语言,将它们设为常量或枚举。没有理由将它们放入数据库中,因为正如您所说,它们可能不会改变。

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

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

高温高压

于 2008-12-18T02:08:09.100 回答
1

您的表中应该有一列 CivilStatus (int),它是对包含所有可能的公民身份的 CivilStatuses 表的外键引用。

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

然后,正如其他人所说,您可以在代码中包含枚举,以使映射更容易。然而,任何时候你向用户显示文本,它都必须来自数据库或资源文件——而不是直接来自代码。

于 2008-12-18T02:09:45.463 回答
0

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

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

于 2008-12-18T02:09:22.063 回答
0

查找表。为什么?

1) 强制数据完整性。至少在列上放置一个检查约束。

2) 本地化

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

Select * from People where MarriageStatus = "single" or is it "Single", or is it "SINGLE"

嗯,我不知道我最好把 ToLower(MarriageStatus) = "single"。糟糕,我不知道在列周围包装函数会阻止它使用索引:)

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

于 2008-12-18T04:21:56.070 回答