参考表而不是枚举字段以提高查找效率
Posted
技术标签:
【中文标题】参考表而不是枚举字段以提高查找效率【英文标题】:Reference tables instead of Enum fields for lookup efficiency 【发布时间】:2016-02-29 02:13:08 【问题描述】:在我的应用程序中,我有一个具有个人资料和地址的用户。这些表之间的关系是:
用户:id
,输入,注册,电子邮件...
个人资料: user_id
、address_id
、first_name、last_name、性别、地位等。
地址:id
,城市,街道,门牌号,公寓
这些表上有一些 Enum
字段,但我认为它可能根本没有效率,因为我将根据他们的地址和个人资料进行一些密集的用户查找,所以我想也许我应该使用参考代替桌子? (我还使用更好的整数获得索引)。
例如,在profiles
中,我有一个status
枚举字段,它现在获取以下值:
所以我想也许在profiles
- status_id
上有一个statuses
表和一个外键。
另一个难题是我是否也应该有一个性别参考表?目前我只在我的枚举字段中接受male
和female
值作为性别,但也许将来我们会想要添加一个跨性别或其他任何东西。当然,我还将根据性别进行深入的用户查找。我是否也应该将其提取到参考表中?
【问题讨论】:
这些都是好主意,但要小心一开始就过度规范化。我们承认我们将不得不在进行过程中稍微调整我们的架构、查询和代码,但您建议的调整并不是明显的性能增强 - 尽管额外的功能可能被证明是必要的。 @strawberry 过度规范化我的数据库有什么缺点?我的选择查询会变慢,因为我需要将更多表加入到查询中? 查询越来越繁琐,维护越来越复杂。就个人而言,我讨厌枚举,所以总是会将它们标准化,但这是一种审美或情感选择,而不是逻辑选择。 @strawberry 哈哈感性的选择。爱它。我也更倾向于使用参考表。我还找到了一个关于规范化和非规范化数据库的非常好的答案。答案是 - 加入和聪明。正确索引您正在加入的字段,您会看到奇迹:***.com/questions/173726/… @kfirba 你最后做了什么?对于gender
和status
这样的场景,我一直在想同样的事情。这些应该有自己的表还是只是作为profiles
的一部分的枚举?
【参考方案1】:
枚举在内部存储为数字。个人资料表中的性别或状态等数据不会经常修改。所以我个人更喜欢枚举。这将避免引用开销。
但是,它也有自己的缺点。
请参考http://chateau-logic.com/content/why-we-should-not-use-enums-databases 了解为什么不使用枚举。如果您在应用程序中使用多种语言,那么枚举是绝对不行的。
【讨论】:
感谢您的回复!我们确实的目标是在未来解决多种语言问题。这足以证明引用表而不是枚举的合理性吗? 另外,当我要寻找一个单身并且是男性并且住在 X 市的用户时,它必须运行字符串比较和带有枚举的全表扫描,对吗?如果我使用参考表,这些字段将被索引,如果我只查看索引字段,它可能会阻止全表扫描。 (这里可能有误,有错请指正) 正如我之前所说,如果您使用多种语言,则应该使用参考表,因为您可能有 1 行用于不同语言的特定值作为列数据。至于字段索引,你可以索引枚举字段。以上是关于参考表而不是枚举字段以提高查找效率的主要内容,如果未能解决你的问题,请参考以下文章