一对一关系正常化了吗?

Goo*_*bot 12 mysql innodb normalization database-design relational-theory

考虑我们有大量的统计数据作为记录;例如 20-30INT列。将整个集合保存在一个表中是否更好,因为它们都属于一个记录或创建另一个以一对一关系连接的表。

前者的优点是避免JOIN并快速访问相应记录的所有统计数据。

后者的优点是保持柱子整洁。第一列是读密集型,第二列是写密集型。当然,我认为它对性能没有显着影响,因为我使用的是行级阻塞的 InnoDB。

一般来说,我想知道为单个记录分离不同的数据集是否实用?

Joe*_*own 21

如果它符合规范化规则,那么 1:1 关系可以被规范化(根据定义!) - 换句话说,1:1 关系没有任何东西使它们无法遵守规范形式。

为了回答您关于 1:1 关系实用性的问题,有时这是一个非常有用的构造,例如当您有具有不同谓词(列)的子类型时。

您使用 1:1 关系的原因取决于您的观点。DBA 倾向于将一切视为性能决策。数据建模者和程序员倾向于将这些决策视为面向设计或面向模型的决策。事实上,这些观点之间有很多重叠。这取决于您的观点和优先事项。以下是 1:1 关系的一些动机示例:

  • 您有一些非常宽的列子集,出于性能原因,您希望在存储中物理隔离它们。

  • 您有一些不经常读取或更新的列子集,出于性能原因,您希望将它们与经常使用的列分开。

  • 您有一些通常是可选的列,但当您知道记录属于某种类型时,它们是必需的。

  • 您有一些逻辑上属于一个子类型的列,并且您希望对它们进行建模以很好地适应您的代码的对象模型。

  • 您有一些列只能应用于实体超类型的某些子类型,并且您希望架构强制其他子类型不存在此数据。

  • 您有一些属于实体的列,但您需要使用更严格的访问规则(例如,员工表上的薪水)来保护这些特定列。

所以你可以看到,有时驱动因素是性能,有时是模型纯度,或者只是希望充分利用声明式架构规则。