【问题标题】:Should I store reference table vales as an enum?我应该将引用表值存储为枚举吗?
【发布时间】:2016-11-11 22:00:27
【问题描述】:

假设我有两张表,一张使用外键存储汽车,另一张参考表存储品牌。有什么更好的做法...创建一个枚举并将汽车属性设为枚举类型,或者从表中加载品牌对象列表?

乍一看,我认为从表中加载品牌会更好,因为如果添加了新品牌,则不需要更改代码(对枚举)。但从性能的角度来看,每次我需要找出所有可能的品牌(例如在验证中)时,我都必须调用数据库,这可能会很昂贵。

有什么好的做法?

`Car {
int SerialNumber;
(int or enum?) BrandId;
string Owner;
DateTime Year;
}`

`(class or enum?) Brand {
int Id;
string Name;
}`

【问题讨论】:

  • 您是否使用任何 ORM,例如 EntityFramework?
  • 当您需要添加新品牌而不是更多的 sql server 行程时,计算“重新安装”软件的成本。
  • 您在为验证品牌进行数据库查询时是否真的存在性能问题?那么,如果您想在源代码中保留数据硬编码,那么数据库的目的是什么?使用数据库,只有当你有性能问题(我怀疑)你才开始考虑另一种方法
  • @botond.botos 我自己编写 sql 查询,但可能会切换到 ORM。

标签: c# mysql enums


【解决方案1】:

我会远离 MySQL 中的枚举;向枚举字段添加新值需要 ALTER TABLE,这有时需要对整个表进行昂贵的重建。

另外,考虑一下您是否真的希望品牌成为代码中的枚举。您真的希望每次有新品牌时都必须重新编译和重新部署吗?

即使您确实决定“重新编译并重新部署”对您来说是正确的答案,也没有什么能阻止您让应用程序本身(或它的安装程序/设置)确保品牌查找表对应于其中的枚举您的代码(只需确保明确指定枚举值的值,并且查找表的 id 不是自动的,以防止不匹配)。

针对枚举要考虑的最后一件事:如果您有多个不同客户端,则需要在所有客户端的代码库中保持枚举同步。 p>

【讨论】:

    【解决方案2】:

    如果不同品牌的业务逻辑不同,最好将其放入代码中。确保特定品牌的 id 在所有数据库中都相同。在这种情况下,请查看诸如“用子类替换类型代码”之类的重构。如果您不使用代码中的 id 来更改某些逻辑,则可以将品牌放入数据库中。您可以缓存这些值以获得更好的性能。我猜品牌不会经常变化。

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      相关资源
      最近更新 更多