我应该将引用表的值存储为枚举吗?

本文关键字:枚举 存储 引用 我应该 | 更新日期: 2023-09-27 18:17:27

假设我有两个表,一个表存储有外键的汽车,另一个表存储品牌。什么是更好的实践……是创建枚举并使car属性为枚举类型,还是从表中加载品牌对象列表?

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

什么是好的习惯?
`Car {
int SerialNumber;
(int or enum?) BrandId;
string Owner;
DateTime Year;
}`
`(class or enum?) Brand {
int Id;
string Name;
}`

我应该将引用表的值存储为枚举吗?

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

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

即使你决定"重新编译和重新部署"对你来说是正确的答案,也没有什么可以阻止你让应用程序本身(或它的安装程序/设置程序)确保品牌查找表对应于你代码中的枚举(只是确保明确指定枚举值的值,而不是查找表的id是一个auto,以防止不匹配)。

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

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