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

Dha*_*ana 4 sql-server normalization

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

Rus*_*Cam 11

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

简而言之,没有.如果需要,3NF规范化表将具有所需的列数

表中的数据取决于密钥,整个密钥,只有密钥(所以请帮助我Codd).

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


Otá*_*cio 10

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


Ant*_*nes 5

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑

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

  • @Stephanie:谢谢你,当然,为了让我能够做到这一点,我必须知道这就是它的名字。我大部分时间都用常识来编码,一段时间后我发现我使用的某种模式已经被聪明人给命名了。以后尽量少用挑战性的评论,不要包括其他假设,比如“愚蠢的回答者隐瞒了他知道并且显然有价值的东西”。例如,简单的评论“此技术称为垂直分区”会好得多,不那么个人化,并且会更好地反映您的情况。 (6认同)
  • 好吧,既然我怀疑你已经完全用尽了有关垂直分区的全部知识,OP 可能想,哎呀,我不知道,谷歌一下。谷歌不会为“AnthonyWJones 在 SO 上所说的那件事”提供好的答案,但会为垂直分区提供好的答案。如果我有更多的代表,我会为你解决它。 (2认同)