有多个“类型”表时有​​哪些设计备选方案

Ada*_*dam 3 best-practices

我正在研究数据库设计,发现自己有很多 *_type 表(例如 user_type、product_type 等),其中这些表的结构基本相同:

user_type (
    id int pk
    label char 
)
Run Code Online (Sandbox Code Playgroud)

我可以通过执行以下操作来简化此操作:

labels (
    id int pk
    label char
    context blah
)
Run Code Online (Sandbox Code Playgroud)

但这是一个合适的方式来做到这一点吗?

Jus*_*ave 6

请不要合并各种_type表格。您未来的自己(以及最终针对表格编写查询的任何人)都会感谢您。

  • 如果您组合这些表,您就放弃了使用参照完整性约束来确保您的表具有有效数据的能力。不可避免地,有人会在不经意间插入未引用查找表中有效行的行。然后,当您运行报告时,您会发现您在所有 61 个州都有客户,其中有些人处于有趣的州,例如“NA”和“X”。
  • 如果您合并这些表,那么未来的开发人员编写查询就会变得更加困难。

我更愿意写一些类似的东西

SELECT p.product_name,
       pt.product_type_name,
       ct.color_name
  FROM product p
       JOIN product_type pt ON (p.product_id = pt.product_id)
       JOIN color_type   ct ON (p.color_id   = ct.color_id)
Run Code Online (Sandbox Code Playgroud)

SELECT p.product_name,
       pt.label product_type_name,
       ct.label color_name
  FROM product p
       JOIN (SELECT *
               FROM labels
              WHERE context = 'PRODUCT_TYPE') pt ON (p.product_id = pt.id)
       JOIN (SELECT *
               FROM labels
              WHERE context = 'COLOR_TYPE') ct ON (p.color_id = ct.id)
Run Code Online (Sandbox Code Playgroud)
  • 如果您有单独的表,优化器更有可能做出正确的决定。您将不可避免地有一些查找表有六行,而另一些查找表有数百行。如果您有单独的表,优化器相对容易确定哪些查找限制性更强,哪些限制性更小。如果将所有_type表放在一起,则数据库可处理的信息往往会少得多,因此选择最有效的计划的可能性就会大大降低。

除此之外,我完全赞同@BillThor 关于如何创建各种查找表的建议。

  • 我同意,结合类型表 IMO 的冲动是过早优化的典型案例。首先,今天有两个字段的表明天可能有五个,其次,在您的表设计中,您需要考虑数据是否相关,而不是结构是否相同。如果您将 Users 和 ProductTypes 组合在一起,因为它们具有“相同”的 id/name 结构,那么您可能会以同时包含“Telephone”和“BasePrice”字段的表结束。 (2认同)