2012-03-12 44 views
1

有很多列表示不良设计的表格吗?例如说我有以下表,用于存储用户信息和用户设置:数据库设计和大表?

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

由于网站需要更多的设置表变得越来越大。在我看来,这个表是标准化的,所有的设置都依赖于userId。

我有一个东西对很多列的表它只是对我来说似乎是错误的,但后来我想起来,你可以选择从表中返回什么数据,所以如果表很大,我仍然可以把它分成几个代码中的不同对象。例如

[User object] 
[UserSetting object] 

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

是上面的常见做法,还是他们的其他技术,处理与许多列更适合使用的表格?

回答

-1

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

+1

另外他应该使用关系数据库管理系统。 – 2012-03-13 01:56:32

1

我会说这是糟糕的桌子设计。如果用户没有这些50个设置中的47个条目,那么你将在表中有大量的NULL,这不是很好的做法,也会降低性能(NULL必须以特殊方式处理) 。

相反,有以下几点:

用户表 标识, 名字 姓氏 等

设置 标识, SettingName

用户设置 标识, SettingId, 用户ID, 设定值

然后,您有一个多对多的加盟,并消除NULL的

2

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

[Users table] 
    userId 
    name 
    address 

[Settings table] 
    settingId 
    userId 
    settingKey 
    settingValue 

该表由用户id列,你可以用它来检索相关您需要的用户设置。

+1

我宁愿放弃'settingId'列(这可能是您的主键),并使用自然键'(userId,settingKey)'。 – 2012-03-12 23:52:41

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分表用更少的列。您可以围绕此结构编写视图和表函数,以为您提供一组相关项目的数据或仅指定特定项目等。您还可以将其他内容添加到属性定义表中以指示所需的数据元素,数据元素的限制等

你对这种设计有什么想法?

+0

也许我不太了解它,但我对这种方法并不疯狂:( – chobo 2012-03-14 18:44:05

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一行代表一个用户,然后一排中的每个表,其中的数据适用于给定用户。如果用户没有任何小部件设置,那么该用户没有行。您可以根据需要左键联接每个表格,以根据需要获取所有设置。通常,您只需要根据正在运行的应用程序的哪一部分来设置一组子设置,这意味着您不需要加入所有表,只需要加入当时需要的一个或两个表。

+0

因此,上述表格在数据库中是1对1的关系?我正在考虑做类似的事情,大表(它们不会有任何空字段),并将其分成不同的类,并只查询填充类所需的数据。对于该场景使用单独的表还是使用一个表最好? – chobo 2012-03-13 16:06:32