Database design 至;“查找表”;还是不?

Database design 至;“查找表”;还是不?,database-design,normalization,Database Design,Normalization,我目前正在为一个项目设计一个数据库。现在我正在和自己争论是否必须创建一个查找表,例如“公民身份”数据,它只能包含固定值,如单身、已婚、分居、寡妇/鳏夫。我很肯定,未来不会再增加其他价值。我应该把它们放在一个单独的表中,还是只在程序代码中硬编码值?根据您的编程语言,将它们设置为常量或枚举。没有理由将它们放入数据库,因为正如您所说,它们很可能不会改变 如果数据进入数据库,下一步是什么?男/女?对/错?:) 我主要使用Java,所有这些项目都作为枚举。在数据库为MySQL的情况下,我们还将列类型创建为

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

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

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

我主要使用Java,所有这些项目都作为枚举。在数据库为MySQL的情况下,我们还将列类型创建为enum。那场比赛也不错


HTH

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


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

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

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


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

硬编码有什么好处?给定一个现代的ORM系统,从DB中读取这些值并使用它们不是很容易吗?如果是这样,那么我看不到硬编码的好处,因为缺点是:

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

“我认为他们不会改变”和“他们不会改变”几乎是两码事。如果它们不能改变,如真/假,那么可以。如果您认为它们不会改变,就不会改变太多。

规范化表示:查找表

常识说:查表

“公民联盟”的概念不是一个自然法,而是一个民法问题——这是可以改变的

如果你需要在项目中基于公民联盟的身份做一些事情,安德鲁·凯南的方法是一个很好的方法。否则,仅查找表就足够了。为什么?

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

2) 本地化

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

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


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

我相信OP的意思是说他将把用户字符串(英文)放在数据库表中,而不是程序员的查找。但是,如果在客户端使用数组对枚举进行转换,则枚举可以工作。也许您可以扩展您的答案,注意到这种可能性?Java枚举允许使用字符串名称而不是枚举名称。对于枚举,可以使用数字表示。不过,要向用户显示文本,我需要从资源文件或数据库中查找字符串。我同意。枚举只是为了让代码可读,而不是向用户显示。我需要更快地键入。答案很好。对于已婚、分居、寡妇/鳏夫来说,要想改变现状,全世界的人都会花上数年的时间更新地球上每个国家的税法。有些地方对同性婚姻(或“民事结合”有不同的法律/规定,如果你愿意的话)