通用数据库设计的方法

时间:2009-08-21 08:08:27

标签: sql-server sql-server-2005 database-design entity-attribute-value

我面对客户的应用程序如下所示:

  • 它允许最终用户输入“材料”。
  • 对于这些材料,他们可以附加任意数量的“属性”。
  • 属性可以具有任何类型的值:decimal,int,dateTime和varchar(长度从5个字符到大块文本不等),

基本上,Schema看起来像这样:

材料
MaterialID int not null PK
MaterialName varchar(100)not null

属性
物业ID
PropertyName varchar(100)

MaterialsProperties
MaterialID
物业ID
PropertyValue varchar(3000)

该应用程序的一个基本功能是搜索功能: 最终用户可以通过输入以下查询来搜索资料:

  • [property] inspectionDate> [DateTimeValue]
  • [property] serialNr = 35465488

猜测它如何在MaterialsProperties表上执行,其中包含近200万条记录。

数据库最初是在SQL Server 2000下创建的,后来又迁移到SQL Server 2005

如何做得更好?

2 个答案:

答案 0 :(得分:1)

您可以考虑按类型分隔您的MaterialsProperties表,例如进入IntMaterialPropertiesCharMaterialProperties等。这将:

  • 对数据进行分区。
  • 允许对整数(或其他数字)类型的查找进行更快速的查找。
  • 潜在地降低存储成本。

您还可以向Type引入Properties列,您可以使用该列来确定要查询的MaterialProperties表。该列还可用于验证用户输入的类型是否正确,从而无需查询给定的“错误”输入。

答案 1 :(得分:0)

  1. 由于用户可以输入自己的属性名称,我猜每个查询都将涉及属性表的扫描(在您的示例中,我需要找到[inspectionDate]的propertyid)。如果属性表很大,则您的连接也需要很长时间。您可以通过使用propertyID进行非规范化和存储名称来尝试进行优化。这将是MaterialsProperties表中的一个denaormalized列。
  2. 您可以尝试将属性类型(int,char等)添加到materialsproperty表,并对该类型的表进行分区。
  3. 查看用于查询优化的对象关系映射/实体属性值模型技术。
  4. 由于您已经拥有大量数据(200万条记录),因此需要进行一些数据挖掘,看是否有许多材料的重复属性组。你可以将它们放在一个模式中,其余的作为EAV表。在此查看详细信息:http://portal.acm.org/citation.cfm?id=509015&dl=GUIDE&coll=GUIDE&CFID=49465839&CFTOKEN=33971901
相关问题