【发布时间】:2014-03-17 07:20:24
【问题描述】:
有一张大桌子products。我需要将布尔标志 disabled 添加到我的产品模型中。通常我只会在现有表中添加一个新字段。但是这个属性将很少使用,并且考虑到表中的记录数,这个新字段会对性能和磁盘空间造成不必要的影响。
所以我决定对一对一关系进行一种 1NF 规范化(即将此字段移动到另一个具有引用 products 的外键的表;我不知道它是否真的是 1NF — 这是一部分我的问题)。但我实际上并不需要每个产品的disabled 属性的true 和false 值,因为这意味着关系的表大小将等于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 科学的角度来看,您如何称呼这个解决方案?
【问题讨论】:
-
这不是反规范化。
-
@ypercube,编辑我的问题的 Jon Hanna 认为是这样。我以为是标准化。
-
是的,我没有注意到编辑。它现在已在您的原始版本中回滚。
标签: sql database normalization