数据库设计和大表?

时间:2012-03-12 23:35:45

标签: sql-server database-design normalization

表中有很多列表示设计不好吗?例如,假设我有下表存储用户信息和用户设置:

 [Users table]
    userId
    name
    address
    somesetting1
    ...
    somesetting50

由于网站需要更多设置,因此表格会变大。在我看来,这个表是规范化的,所有设置都依赖于userId。

我对有很多列的表有一些看法我觉得不对,但后来我记得你可以选择从表中返回什么数据,所以如果表很大我仍然可以把它分成几个不同的代码中的对象。例如

[User object]
[UserSetting object]

并仅返回数据以填充这些对象。

上述常见做法,还是其他技术处理的表格中有很多列更适合使用?

5 个答案:

答案 0 :(得分:2)

我认为你应该使用这样的多个表:

[Users table]
   userId
   name
   address

[Settings table]
   settingId
   userId
   settingKey
   settingValue

这些表与userId列相关,您可以使用该列来检索所需用户的设置。

答案 1 :(得分:1)

我会说这是糟糕的桌面设计。如果用户没有为这50个设置中的47个设置条目,那么表格中将有大量的NULL,这不是一个好习惯,也会降低性能(NULL和# 39;必须以特殊方式处理。)

相反,请注意以下事项:

USER TABLE ID, 名字 姓 等

设置 ID, SettingName

用户设置 ID, SettingId, 用户身份, SettingValue

然后你有多对多的连接,并消除了空白

答案 2 :(得分:1)

首先,不要在表名中加上空格!所有[牙套]将是一个真正的痛苦!

如果您有50列,那么每个用户的所有数据都有多大意义?会有很多空值吗?大多数数据甚至可能不适用于任何给定用户。想想1到1个表,您可以将“设置”分解为逻辑组:

Users:              --main table where most values will be stored
    userId
    name
    address
    somesetting1    ---please note that I'm using "somesetting1", don't
    ...             --- name the columns like this, use meaningful names!!
    somesetting5

UserWidgets         --all widget settings for the user
    userId
    somesetting6
    ....
    somesetting12

UserAccounting      --all accounting settings for the user
    userId
    somesetting13
    ....
    somesetting23

--etc..

每个用户只需要一个Users行,然后每个表中有一行,其中该数据适用于给定用户。如果用户没有任何窗口小部件设置,那么该用户没有行。您可以根据需要左键连接每个表,以根据需要获取所有设置。通常,您只需要根据正在运行的应用程序的哪个部分处理一组子设置,这意味着您不需要加入所有表,只需要加入当时所需的表或两个表。

答案 3 :(得分:0)

您可以考虑属性表。只要你的索引很好,那么你就不会有太多的性能问题:

[AttributeDef]
   AttributeDefId int (primary key)
   GroupKey varchar(50)
   ItemKey varchar(50)
   ...

[AttributeVal]
   AttributeValId int (primary key)
   AttributeDefId int (FK -> AttributeDef.AttributeDefId)
   UserId int (probably FK to users table?)
   Val varchar(255)
   ...

基本上你将带有许多列的表“旋转”到具有较少列的2个表中。您可以围绕此结构编写视图和表函数,为您提供一组相关项或仅特定项等的数据。您还可以向属性定义表添加其他内容以指示所需的数据元素,对数据元素的限制等等。

您对此类设计有何看法?

答案 4 :(得分:-1)

使用具有匹配索引的多个表来获得最佳的SELECT速度。使用索引作为使用JOIN关联表之间信息的方法。