方法通用数据库设计(Approach to generic database design)

2019-08-02 01:24发布

我现在面临在客户的应用,看起来是这样的:

  • 它允许最终用户输入“材料”。
  • 为了这些材料,它们可以附加任意数量的“性质”的。
  • 属性可以有类型的任何值:小数,整型,日期时间和varchar(长度从5个字符变化到大文本),

从本质上讲,该模式是这样的:

物料
MaterialID诠释不为空PK
MaterialName VARCHAR(100)NOT NULL

属性
物业ID
的PropertyName VARCHAR(100)

MaterialsProperties
MaterialID
物业ID
VARCHAR的PropertyValue(3000)

该应用程序的一个重要特点是搜索功能:最终用户可以通过输入查询,如查询资料:

  • [属性] inspectionDate> [DateTimeValue]
  • [属性] serialNr = 35465488

猜猜它的成效在MaterialsProperties表与它近2万条记录。

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

怎么可以这样做的更好?

Answer 1:

  1. 由于用户可以输入自己的属性名称,我想每个查询将涉及的属性表的扫描(在你的榜样,我需要找到[inspectionDate]的物业ID)。 如果属性表很大,你的加入也需要很长的时间。 你可以尝试和非规范化,并与物业ID存储名字优化。 这将是在MaterialsProperties表中的列denaormalized。
  2. 你可以尝试添加属性类型(INT,焦炭等)的materialsproperty表和类型分区表。
  3. 看看对象关系映射/实体属性值模型技术查询优化。
  4. 既然你已经有大量的数据(2万条记录)的做一些数据挖掘是看是否有重复的属性组对许多材料。 你可以将它们装在一个模式中,其余为EAV表。 看看这里的细节: http://portal.acm.org/citation.cfm?id=509015&dl=GUIDE&coll=GUIDE&CFID=49465839&CFTOKEN=33971901


Answer 2:

你可以考虑类型1如分离的MaterialsProperties表到IntMaterialPropertiesCharMaterialProperties等,这将:

  • 分区数据。
  • 允许潜在更快看起坐为整数(或其他数字)类型查找窗口。
  • 潜在地降低存储成本。

你也可以引入一个TypeProperties ,你可以用它来确定哪些MaterialProperties表查询。 列也可以用来验证用户输入的是正确的类型,无需查询给出“坏”的输入。



文章来源: Approach to generic database design