如果我们必须存储公司的可用职位(即经理,团队负责人等)。存储它的最佳做法是什么?我有两个评论意见......“当然,欢迎你们”
的
在我看来,如果我有更改项目,我会选择第一个解决方案。因此,我不会将这些选项硬编码为Enum
如果我毫不怀疑数据不会改变(例如,性别:男性,女性),我可以选择Enum解决方案。
注意:我用英语编码,UI文化可能是阿拉伯语。如果我将使用Enum解决方案,我将在表示层中对基于文化的字符串进行硬编码,从最佳实践角度来看是否可以!
我想知道你的意见,如果我的想法符合最推荐的“最佳实践”?
答案 0 :(得分:40)
通常,您应该只使用枚举,其中有一组明确的项目不会改变,例如:原色或大陆名称。否则,具有适当实现的外键的查找表几乎总是最佳选择。
查找表选项可能存在差异,您可能会为简单的ID /值关系提供大量查找表。域/查找表对可以显着减少所需的表的数量,尽管具有一些额外的编码复杂性。在这种情况下,您将拥有一个域表
DomainID int identity Domain varchar(255)
和键/值表
DomainID int ID int identity Value varchar(255)
因此,对应于您将使用的每个查找表的域表中添加一行,并将所有(键 - 域)/值对添加到值表中。除了简化数据库结构之外,这种方法还具有可以在应用程序代码中动态创建“查找表”的优点,这在某些应用程序中非常有用。
答案 1 :(得分:10)
选项1:将其存储为包含列ID和名称的数据库表,并使用查询和连接处理是您应该执行的最小操作。
来自“Five Simple Database Design Errors You Should Avoid”:
虽然开发人员有时会优先考虑应用程序强制完整性,但DBMS仍然必须是所有完整性的集中执行者。
建议的最佳做法是实现数据库,就好像它对用户界面一无所知。也就是说,数据库应该执行与数据有关的所有规则;在这种情况下,数据库应该强制执行适当的值。要枚举适当的值,每种类型的查找值lookup table通常是要走的路。很多时候,应用程序来来往往,但数据库仍然存在并被重用。
如果要在应用程序中强制执行枚举,您当然可以这样做,但无论您做什么,请确保数据库作为数据库完成其工作并保持数据的完整性。如果麻烦,请经历麻烦;你正在奠定基础。在“Database Design and the Leaning Tower of Pisa”中,作者强调为什么在数据库中正确地奠定基础非常重要。
我希望这会有所帮助。
答案 2 :(得分:5)
我倾向于使用数据库选项,因为这样可以轻松查询有意义的数据(即名称而不是ID)。
如果我相信这些值不会改变,那么我将在应用程序中枚举它们,以及当您不必记住项目的ID并使代码更具可读性时,它使开发更容易。
这种方法允许我选择是否在查询中包含查找表。例如,我将它包含在一个报表查询中,我想显示查找值但在我的应用程序中加载数据时可能不包括它,如果我可以从枚举中推断它。
显然,如果值可能会发生变化或修改,则可能无法进行枚举。
只有你可以判断UI文化的影响,我100%肯定我的用户的文化,所以不必太担心它:)。
答案 3 :(得分:4)
我总是选择数据库选项,因为它有几个优点,其中一个主要是您可以更改查找列表中项目的名称/描述,而无需更改任何代码。同意使用单个表而不是许多小表,这样就可以编写一个例程来从数据库中检索值,从而降低维护成本。拥有一个例行程序意味着您可以投入更多精力使其表现良好。
除了上面的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
答案 4 :(得分:2)
Lookups,Lookups,Lookups(在这里插入猴子跳舞视频)
我的个人“最佳做法”是拥有数据库中的所有内容。公司中的职位绝对是一个查询表。
翻译也是如此,这可能有点棘手,但通常将表与转换表连接起来的视图定义是一个良好的开端。
此外,如果Position只是一个int值,并且您的应用程序是单语言,则可以将位置标题直接添加到数据库中。
答案 5 :(得分:2)
我倾向于几乎总是将这种东西放在桌子上。如果它需要很多我会缓存它。如果我需要以编程方式引用其中的一些,我将创建一个枚举,其值设置为查找项的键值。
例如,代理主键(通常我的数据访问层可以无痕地添加/更新它),项目值的字段加上“候选”(候选者在引号中,因为它不是必需的,所以它要么是唯一的,要么是空的。这样我可以使用引号中的枚举来引用表中的特定/重要项目,但仍然可以让最终用户添加新项目。所使用的数据模型的细节实际上取决于您的偏好(有些人现在可能会尖叫我,而不仅仅是使用“候选”字段作为真正的主键)。
答案 6 :(得分:2)
您是否计划将这个雇主名单纳入数据库?
如果是,请将其放入文件中,然后完成。
数据库非常棒,但是如果你需要一个简单的键值,它们就会有点过分。他们给你很多东西。但是他们也在幕后做了很多事情,他们还需要支持一件事...如果你能用一个带有20个制表符分隔线的单个文件,那就简单了。
如果您有很多需要这些查找的事情,或者您认为在客户端尝试阅读它们时可能需要更新它们,或者您可能希望稍后交叉引用 - 然后去找DB。
答案 7 :(得分:1)
我通常更喜欢两者。我在dal层中使用table,因为它们可用于诸如用于报告,SQL查询和其他目的的tableau之类的工具。
我在前端和业务层使用枚举,因为它很容易用它们开发,你不必从dal获取列表,你也不必记住表中的值。
如果表格和枚举中的列表相同,C#会自动将枚举转换为相应的ID。
在MVC中,您可以在视图中使用带有枚举的下拉列表作为@ Html.EnumDropdownListFor(),这样您就不必点击数据库本身来获取下拉列表。
答案 8 :(得分:0)
如果你能让它们保持同步,我认为没有太多理由不同时使用它们。当我使用DB存储开发一些状态机功能时,在IDE中枚举可用对象状态变得更加容易。
我自己写了一篇EnumGenerator Visual Studio Addin,它在C#中从您在IDE中选择的数据库平板电脑的ID和DESC列中创建了一个Enumeration代码片段。我还没有发布它,因为这是我第一次使用VS Addins并且它非常垃圾但是我敢打赌,有一些添加/代码生成经验的人可以接受这个想法并运行它。