数据库规范化:哪个最合适?

Jai*_*ake 3 mysql normalization database-design

我有 3 种不同类型的数据集:

通知:

  • 开始日期
  • 结束日期
  • 通知类型
  • country_id
  • state_id

活动:

  • 开始日期
  • 结束日期
  • 用户通知

交易

  • 电子邮件
  • 交易价值

所有这 3 个都有相同类型的子表,其中将有指向这些表的外键。

什么类型的设计最好?

  1. 3 个不同的表和一个子表,它将有 3 个不同的列作为指向每个不同父级的主键?
  2. 1 个组合父表,允许为任何特定类型不需要的列提供空值,还有一个main_type列表示每条记录是活动通知还是交易。子表将只有一个外键列。
  3. 3 个不同的表,每个主表类型 1 个,每个主表的子表使用主表的主键作为外键。

Joe*_*own 5

具有相同类型的列与具有相同的实体类型不同规范化与代码重用不同

规范化是将您的列以这样的方式排列到表中,以避免插入、更新和删除异常。它是关于减少可能导致这些异常的冗余种类,而不是因为它们看起来相似而将它们放在一起。

作为首选,您应该让数据库引擎使用其声明性约束(外键、唯一键等)来保护数据的完整性。这样可以节省编写应用程序代码来执行此操作,并且从长远来看可以减少系统错误。

这意味着您应该在默认情况下至少瞄准第三范式 (3NF),然后再考虑是否需要任何非规范化。

从这个角度来看,您的第一个选择并不好,因为您将三种不同类型的子数据塞入一个表中。您无法以这种方式干净或轻松地控制参照完整性。您仅有的两个常规实用选项是 2 和 3。

在选项 2 和选项 3 之间进行选择取决于具体情况,并且可能在很大程度上取决于您的个人喜好。有些人会避免选项 2,因为他们认为所有的 null 都是邪恶的。其他人会避免选项 3,因为他们不喜欢有太多不同的表。这是一场没有明确、合乎逻辑的答案的“圣战”辩论。

出于实际目的,查看您的三个主要表,我会说它们看起来并没有太多共同之处。有一点重叠,但不是很多。 因此,我倾向于选项 3。 将您的表分开,以便您的代码和数据保持干净。

顺便说一句:您没有显示子表的详细信息。如果这三个子表具有相同的结构并且您担心应用程序代码重复,请考虑创建一个处理子表结构的类,并为三个子表中的每一个从该类继承。这将为您提供代码重用,而不会影响数据完整性。