规范化一对一布尔关系

时间:2014-02-17 20:18:42

标签: sql database normalization

有一张大表products。我需要在产品模型中添加布尔标志disabled。通常我只会向现有表添加一个新字段。但是很少使用这个属性,并且考虑到表中的记录数,这个新字段将对性能和磁盘空间造成不必要的打击。

所以我决定对一对一关系进行一种1NF规范化(即将此字段移动到另一个具有外键引用products的表;我不知道它是否真的是1NF - 这是我问题的一部分)。但实际上,每个产品的true属性并不需要falsedisabled值,因为这意味着关系的表大小将等于products的大小。所以在关系表的值字段中没有必要。所以我的架构是:

CREATE TABLE products (
  id INT PRIMARY KEY,
  name VARCHAR
);

CREATE TABLE disabled_products (
  product_id INT NOT NULL,
  CONSTRAINT fk_product FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE
);

SQLFiddle摆弄)。

因此,我收到了我想要的内容 - 该值仅存储在设置标志的极少数情况下。在幕后,标志不是由表格列表示,而是由disabled_products中对于给定产品的记录表示。

只想知道我做得对。

此类设计可能存在哪些缺点?

它是否适合关系模型(通过我的意思是这种标准化方式,特别是一个由单个外键列组成的表)?如果是的话,您如何根据RDB科学来称呼这个解决方案?

2 个答案:

答案 0 :(得分:2)

人们常常会问自己是应该拆分表还是只创建一个大表。我将谈谈底部的一般逻辑。在您的情况下,它纯粹是一个明确定义的性能计算。

优点&您的解决方案 1)CON:即使很少禁用记录,您也需要将此表左键连接到需要有效记录的每个查询。

2)CON:节省的空间是1个字节,这很可能是微不足道的,所以为什么要这么麻烦。

3)PRO:它可以帮助您免于更改可能对您有用的表格。

推荐:鉴于上述优点和缺点,我建议您只在表格中添加一个字段。这只是一个字节。

通常,当甚至修改表或者每个记录都需要一组特定字段的不同类记录时,或者出于性能原因他们想要对表进行分区时,人们会垂直拆分表。 / p>

答案 1 :(得分:1)

可能的缺点是显而易见的 - 与将其存储为列值相反,您不能假设每一行都有disabled值(因此您必须应用一些自定义逻辑)并且您不能内部加入两个表,因为较小的表会显着减少您的结果集。此外,附加表不包含任何重要信息,但说明禁用状态,因此纯粹是多余的,但就“支持性能的冗余”而言,我觉得某种方式提醒了星型模式(http://en.wikipedia.org/wiki/Star_schema)。