2009-10-21 42 views
3

我需要存储一个包含大量用户定义字段(在编译时不知道,但可能大约20到40个定制字段)的大型表(数百万行)字段)。对于我来说,能够根据这些自定义字段查询数据是非常重要的(性能方面):即“选择该属性具有该值的行,该属性是该值等。”。每个查询都有20到30个WHERE子句。在SQL数据库中实现用户定义的字段并建立索引

我的想法而已:

  1. 更改数据库模式,每次新的用户字段来实现。将每个用户定义的字段保留为表格中的一列。在每个自定义创建的列上添加和维护索引。如何正确构建这些索引是一个大问题,因为我不知道在WHERE查询中将使用哪些属性(列)。

  2. 将自定义字段存储为XML类型列。据我从SQL2005了解,我可以在XML类型的列中查询XML。虽然不太确定表现。

  3. Entity Attribute Value。这是我现在使用的,但这是一个痛苦。

有什么建议吗?

编辑: 一些关于我的要求的说明。我有一张桌子,40-50万行(例如)ID号码和与这些ID相关的各种属性。

让我们说20万是有“CustomAttribute1”等于2,那么500万有“CustomAttribute2”等于“是” 300万有“CustomAttribute20”等于“不”

I need a FAST method of returning all IDs where: 
    1. CustomAttribute1 = 2 
    2. CustomAttribute2 = 'Yes' 
    3. CustomAttribute4 = null 
    4. CustomAttribute20 != 'No' 
    etc... 

我们有这实现了EAV:选择查询是实施和维护的噩梦,它需要很长时间才能返回结果,并且最令人讨厌的是即使对于小数量的数据,DB也会扩展到巨大的大小,这很奇怪,因为EAV本质上是规范化数据,但我认为所有的指标占用一堆空间。

+0

你能澄清你在做什么,即表中有什么样的数据。此外,这些自定义字段是唯一的列吗? –

回答

4

看来你已经列出了你的可用选项。 EAV可能是一种查询的痛苦(而且速度很慢,取决于您想同时搜索多少条标准),但它往往是最“理智”的和RDBMS不可知的实现。

修改模式是一个禁忌......显然它可以完成,但这种做法是可恶的。我不赞成。

XML选项是一个解决方案,SQL Server可以在结构中查询。我不确定其他关系型数据库系统,而且您不会在帖子或标签中列出您使用的是哪一个。

如果您要同时查询许多属性(比如20+),那么我可能会推荐XML解决方案来限制您必须创建的连接数。除此之外,我会坚持使用EAV。

+0

与查询常规列相比,查询XML的速度如何。他们甚至会索引XML吗? – Radu094

+0

您可以在XML上创建索引。我将给具有数据库XML经验的人留下具体的基准,而不是我,但互联网上有大量关于SQL Server中的XML查询和索引的信息。 –

0

您可以使用XML列表示所有用户定义的字段,例如,

“但我不确定这样做会对性能产生什么影响,但在我看来,它绝对是处理数据库中UDF的最好方式。“

<UDF> 
     <Field Name="ConferenceAddress" DBType="NVarChar" Size="255">Some Address</Field> 
     <Field Name="ConferenceCity" DBType="NVarChar" Size="255">Some City</Field> 
     ...etc 
    </UDF> 

然后我会做的就是把一个触发器在桌子上,这样,当列将更新它再现了其拉出的XML值作为视图列的表的视图。锁定视图等然后我会创建一个存储过程来更新XML,这样它就可以在你的用户定义字段xml格式之后的任何XML列上工作,例如插入/更新/删除/获取

GetUDFFieldValue AddUDFField 向上dateUDFField DeleteUDFField

- 共享参数 表名 的ColumnName (例如使用动态SQL通过X列名称从X表中获取XML,以使其对所有UDF字段具有通用/通用性)

以下是关于Sql Server 2005中的XML性能优化的文章(未在新版本版本):

http://technet.microsoft.com/en-us/library/ms345118(v=sql.90).aspx

最后:

你确定你甚至需要一个RDBMS? NoSql更适合用户生成的字段,我甚至可以考虑同时使用NoSql和Sql Server。

相关问题