单表中的列太多 - 它是否是正常的形式?

时间:2009-02-03 12:51:49

标签: sql-server normalization

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

5 个答案:

答案 0 :(得分:11)

  

之间是否有任何关系   列数和一个好   正常化过程?

简而言之,没有。如果

,3NF规范化表将具有所需的列数
  

表中的数据是依赖的   关键,整个关键,什么都没有   但关键(所以帮助我Codd)。

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

答案 1 :(得分:10)

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

答案 2 :(得分: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表来保存Username和PasswordHash字段,并与Person表保持一对一的关系。

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

修改

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

答案 3 :(得分:3)

虽然我同意@ocdecio,但我还会发现,在数据存储要求相同的情况下,规范化的数据库通常每个表的列数更少,而表的数量更多。类似于代码味道,在给定相当大的应用程序的情况下,数据库气味将是相对较少的表。这可能暗示您的数据可能不是正常形式。在适当的情况下应用规范化规则可以缓解这种“嗅觉”。

答案 4 :(得分:0)

每列必须与主键具有直接和排他关系。如果你有一个属性很重的项目,你可以做很多事情来简化模型。任何分裂成多个表的尝试都会适得其反,毫无意义。