当前位置:  开发笔记 > 编程语言 > 正文

查找表最佳实践:数据库表...或枚举

如何解决《查找表最佳实践:数据库表或枚举》经验,为你挑选了4个好方法。

如果我们必须存储公司的可用职位(即经理,团队负责人等).存储它的最佳做法是什么?我有两个评论意见......"当然,欢迎你的"

    将其存储为包含列ID和名称的DB表,并使用查询和连接处理它.

    将其存储为枚举并忘记数据库表.

在我看来,如果我有更改项目,我会选择第一个解决方案.因此,我不会将这些选项硬编码为Enum.
如果我毫不怀疑数据不会改变(例如,性别:男性,女性),我可以选择Enum解决方案.

注意:我用英语编码,UI文化可能是阿拉伯语.如果我将使用Enum解决方案,我将在表示层中对基于文化的字符串进行硬编码,从最佳实践角度来看是否可以!

我想知道你的意见,如果我的想法符合最推荐的"最佳实践"?



1> Cruachan..:

通常,您应该只使用枚举,其中有一组明确的项目不会更改,例如原色或大陆名称.否则,具有适当实现的外键的查找表几乎总是最佳选择.

查找表选项可能存在差异,您可能会为简单的ID /值关系提供大量查找表.域/查找表对可以显着减少所需的表的数量,尽管具有一些额外的编码复杂性.在这种情况下,您将拥有一个域表

DomainID int identity
Domain   varchar(255)

和一个键/值表

DomainID int
ID       int identity
Value    varchar(255)

因此,对应于您将使用的每个查找表的域表中添加一行,并将所有(键 - 域)/值对添加到值表中.除了简化数据库结构之外,这种方法还具有可以在应用程序代码中动态创建"查找表"的优点,这在某些应用程序中非常有用.


有趣.我刚读了一篇关于不使用这种方法的权威文本.引用:"这在文献中被称为OTLT("一个真正的查询表")或MUCK("大规模统一代码密钥").这是非常糟糕的设计." 来源:http://joecelkothesqlapprentice.blogspot.com/2007/06/db-table-design-question.html
@Toad,有趣的文章和好点,但我认为完全解雇一项技术是不明智的.正如我个人所说,我更喜欢单独的查找和代码这些99%的时间,但有时它有一个地方.我第一次看到它被广泛使用的是Oracle Accounting IV,我记得它用于向名人群体添加验证,我认为在该实例中使用可能是相当合适的(否则将需要几百次查找)和我确定还有其他类似的例子.不分青红皂白地使用 - 没有.
+1我已经多次使用(成功)这种方法.

2> Kevin Lee Ga..:

选项1:将其存储为具有列ID和名称的DB表,并使用查询和连接处理它是您应该做的最小值.

从" 你应该避免的五个简单的数据库设计错误 ":

虽然应用程序强制完整性有时受到开发人员的青睐,但DBMS仍然必须仍然是所有完整性的集中执行者.

建议的最佳实践是实现数据库,就好像它对用户界面一无所知.也就是说,数据库应该执行与数据有关的所有规则; 在这种情况下,数据库应该强制执行适当的值.要枚举适当的值,通常可以使用每种查找值的查找表.很多时候,应用程序来来往往,但数据库仍然存在并被重用.

如果要在应用程序中强制执行枚举,您当然可以这样做,但无论您做什么,请确保数据库作为数据库完成其工作并保持数据的完整性.如果麻烦,请经历麻烦; 你正在奠定基础.在" 数据库设计和比萨斜塔 "中,作者强调为什么在数据库中正确地奠定基础非常重要.

我希望这有帮助.



3> Simon..:

我倾向于使用数据库选项,因为这样可以轻松查询有意义的数据(即名称而不是ID).

如果我相信这些值不会改变,那么我将在应用程序中枚举它们,因为当你不必记住项目的ID并使代码更具可读性时,它使开发更容易.

这种方法允许我选择是否在查询中包含查找表.例如,我将它包含在报表查询中,我想显示查找值但在我的应用程序中加载数据时可能不包括它,如果我可以从枚举中推断它.

显然,如果值可能会发生变化或修改,则可能无法进行枚举.

只有你可以判断UI文化的影响,我100%肯定我的用户的文化,所以不必太担心它:).



4> James Piggot..:

我总是选择数据库选项,因为它具有多个优点,主要优点之一是您可以更改查找列表中项目的名称/说明,而无需更改任何代码。还同意拥有一个表而不是很多小表,这样您就可以编写一个例程来从数据库中检索值,从而降低了维护成本。拥有一个常规程序意味着您可以投入更多的精力来使其表现良好。

除了上述Cruachan的答复之外,如果您具有父子关系,而没有父行的行描述了域,则可以不用一个表。属于域的所有记录都以域行作为其父级。

ID           int autonumber -- integer primary key for performance
DomainID     int            -- null for domains
Name         varchar(100)   -- Name of the item
Description  varchar(255)

因此,例如货币列表可以包含:

 ID    DomainID   Name              Description

 100   NULL       ISO Currencies    List of ISO Currency codes
 101   100        BHD               Bahrain Dinar
 102   100        GBP               British Pound
 103   100        EUR               Euro  
 104   100        USD               US Dollar

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有