表中有很多列表示设计不好吗?例如,假设我有下表存储用户信息和用户设置:
[Users table]
userId
name
address
somesetting1
...
somesetting50
由于网站需要更多设置,因此表格会变大。在我看来,这个表是规范化的,所有设置都依赖于userId。
我对有很多列的表有一些看法我觉得不对,但后来我记得你可以选择从表中返回什么数据,所以如果表很大我仍然可以把它分成几个不同的代码中的对象。例如
[User object]
[UserSetting object]
并仅返回数据以填充这些对象。
上述常见做法,还是其他技术处理的表格中有很多列更适合使用?
答案 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关联表之间信息的方法。