5

规范化的表应该有更少的列数,并且可以有尽可能多的引用字段。这是正确的方法吗?列数与良好的规范化过程之间是否存在任何关系?

4

5 回答 5

12

列数与良好的规范化过程之间是否存在任何关系?

简而言之,没有。一个 3NF 规范化的表将有尽可能多的列,前提是

表中的数据依赖于键,整个键,除了键之外什么都没有(所以帮帮我 Codd)。

在某些情况下,(某些)非规范化实际上可能会提高性能,而何时应该这样做的唯一真正衡量标准是对其进行测试。

于 2009-02-03T12:56:48.170 回答
10

您应该遵循规范化原则,而不是关心表中的列数。业务需求将驱动实体、它们的属性和它们的关系,没有绝对的数字是“正确的”。

于 2009-02-03T12:53:56.493 回答
4

如果您觉得表格的字段过多,可以使用以下方法。例子:-

CREATE TABLE Person
    Person_ID int not null primary key,
    Forename nvarchar(50) not null,
    Surname nvarchar(50) not null,
    Username varchar(20) null,
    PasswordHash varchar(50) null

此表代表人,但显然并非所有人都需要成为用户,因此 Username 和 PasswordHash 字段可以为空。然而,可能会有比用户多 1 或 2 个数量级的人。

在这种情况下,我们可以创建一个 User 表来保存与 Person 表一对一关系的 Username 和 PasswordHash 字段。

您可以通过查找可以为空的字段集来概括此方法,这些字段要么一起为空,要么一起具有值并且很可能为空。这表明您可以提取另一个表。

编辑

感谢 Stephanie(见评论),这种技术显然被称为“垂直分区”

于 2009-02-03T13:12:14.117 回答
3

虽然我同意@ocdecio,但我也会观察到,在相同的数据存储要求的情况下,一个经过规范化的数据库通常每个表的列数更少,而表比非规范化的数据库多。与代码异味类似,如果应用程序相当大,数据库异味将是相对较少的表。这暗示您的数据可能不是正常形式。在适当的情况下应用规范化规则将减轻这种“气味”。

于 2009-02-03T12:59:07.137 回答
0

每列必须与主键具有直接且排他的关系。如果您有一个属性重的项目,那么您可以做的事情就是简化模型。任何拆分成多个表的尝试都将适得其反且毫无意义。

于 2009-02-03T13:28:58.323 回答