在sql server 2008中索引优缺点

时间:2009-11-19 04:53:22

标签: sql-server database-design sql-server-2008 indexing

我正在社交网站上工作。现在我们的团队决定以非规范化的方式存储用户配置文件。所以我们的表结构就像这样

此处属性表示用户个人资料的一个字段,例如名字,姓氏,出生日期等...

和组表示一组字段的名称,例如个人详细信息,学术信息,成就等。

**

  

属性/组主 - 它创建   组和属性的层次结构。

**

Attribute_GroupId      bigint   
ParentId               bigint   
Attribute_GroupName    nvarchar(1000)   
ISAttribute            bit  
DisplayName            nvarchar(1000)   
DisplaySequence        int  

**

  

属性控制信息 - 存储哪些   必须在运行时填充控件   属性的时间以及它的时间   验证标准......

**

Attribute_ControlInfoId     bigint  
AttributeId                 bigint  
ControlType                 nvarchar(1000)  
DataType                    nvarchar(1000)  
DefaultValue                nvarchar(1000)  
IsRequired                  bit 
RegulareExpression          nvarchar(1000)  

**

  

最后属性值在哪里   每个属性,用户明智的价值观   将被存储

**

AttributeId      bigint         Checked
IsValueOrRefId   bit            Checked
Value            nvarchar(MAX)  Checked
ReferenceDataId  bigint         Checked
UserId           bigint         Checked
                                Unchecked

现在他们说我们将在属性值表上创建索引。那里也没有主键。

因为这个表中存储了大量数据。例如如果有5000万用户和30个属性,它将存储1500万条记录。在这种情况下,如果我们在表上创建索引,则不是Insert和Update语句将非常慢以及在为一个用户提取数据时。 quires也会很慢。

我认为有一个选项,而不是属性明智的值,我可以为一个用户存储一个XML记录。

所以,请有人帮我找出这个案例的最佳选择。我应该如何存储数据?

这里我不能制作硬代码表,因为管理员可以在任何时候添加新字段,所以我需要一些数据结构,我只需1-2步就可以轻松添加用户配置文件中的任何字段。

如果有人有更好的解决办法,请回复我。

3 个答案:

答案 0 :(得分:4)

你们需要一个dba!

这是其中一个EAV桌子,它会让你不顾一切!

答案 1 :(得分:4)

Bill Karwinhis blog)组合了一个SQL反模式PPT

他为EAV提供了3种替代解决方案。

索引是您最不担心的......

答案 2 :(得分:3)

查看那些突出设计选择有多糟糕的文章,以及如果您坚持使用该设计会遇到的潜在问题:

这似乎是一个相当常见的设计问题 - 对于程序员来说,使用属性/值表来解决它似乎是一个好主意 - 但从数据库性能的角度来看,它确实不是一个好主意。

此外:

  

现在他们说我们会创造   属性值表上的索引。那里   那里也没有主键。

正如一些SQL专家所说:“如果它没有主键,那么它就不是表格。”

您肯定需要找到一种方法来将主键放到表中 - 如果您没有可以使用的任何内容,请添加“INT IDENTITY(1,1)”类型的“ID”列它,并将主键放在该列上。你需要一把钥匙!数据库设计,第一课,前五分钟......

您需要重新考虑您的设计,并提出更聪明的内容来存储您需要的数据。