gpt4 book ai didi

sql - 规范化一对一 bool 关系

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:55 24 4
gpt4 key购买 nike

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

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

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 科学的角度来称呼此解决方案?

最佳答案

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

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

2) 缺点:节省的空间是 1 个字节,这很可能可以忽略不计,所以何必呢。

3) PRO:它使您不必更改表格,这对您来说可能是个问题。

建议:考虑到上述优点和缺点,我建议只向您的表中添加一个字段。这只是一个字节。

一般来说,当甚至修改一个表都不切实际时,或者当有不同类别的记录每个都需要一组特定的字段时,或者当出于性能原因他们想要对表进行分区时,人们会垂直拆分他们的表。

关于sql - 规范化一对一 bool 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21838513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com