大表中的新布尔列或 - 坏主意?- 新的相关 0-1 表

Mas*_*ure 6 database-design sql-server

我有一个像这样的大表(2000 亿行):

CREATE TABLE A (
A_Id INT NOT NULL PRIMARY KEY, 
A_Attribute1 VARCHAR(100) NOT NULL, 
... )
Run Code Online (Sandbox Code Playgroud)

我必须添加新的布尔列 NOT NULL 并将 false 作为默认值,如下所示:

ALTER TABLE A ADD A_BitAttribute BIT NOT NULL DEFAULT 0
Run Code Online (Sandbox Code Playgroud)

而且,在未来,该列大部分时间为 0。

为了防止在 A 表中添加此列的成本,我考虑创建一个新的相关表,如下所示:

CREATE TABLE ABitAttribute (
A_Id INT NOT NULL PRIMARY KEY, 
, CONSTRAINT FK_ABitAttribute_A FOREIGN KEY (A_Id) REFERENCES A (A_Id) ON DELETE CASCADE
)
Run Code Online (Sandbox Code Playgroud)

此表中的一行表示 A_Id 为 True,没有行表示 False。检索数据所需的外连接并没有让我太烦恼。

使用这种技术有什么重大缺点或违反理论吗?

编辑 :

  • 它必须与 SQL Server 2005 兼容
  • 服务中断必须最小(我们通常保证数据库不超过 1 小时)

Len*_*art 4

从理论角度来看,布尔值有点可疑(但不一定是错误的)。这个想法是我们存储真实的命题,缺少某些东西被认为是错误的。所以,从理论上来说,你的建议绝对没有问题。如果不知道你的属性代表什么,就很难比这更具体。

从实际角度来看,由于大多数行都是 false,因此您可以通过不对几乎所有行存储 false 来节省一些空间。

缺点是您必须进行外部联接,这可能会影响性能。

编辑:正如 @eckes 在他的评论中指出的,A 中的删除必须调查 ABitAttribute 是否存在被删除的 id。更新也是如此(如果 id 列被更新)。对于插入,应该没有影响

  • > 从 SQL Server **2012 (11.x) Enterprise Edition** 开始,当默认值是运行时常量时,添加具有默认值的 NOT NULL 列是联机操作。 (2认同)