簡體   English   中英

通用數據庫設計方法

[英]Approach to generic database design

我面向客戶的應用程序如下所示:

  • 它允許最終用戶輸入“材料”。
  • 對於這些材料,它們可以附加任意數量的“屬性”。
  • 屬性可以具有任何類型的值:十進制,整數,日期時間和varchar(長度從5個字符到大塊文本不等),

本質上,該架構如下所示:

物料
MaterialID int不為空PK
MaterialName varchar(100)不為null

屬性
物業ID
PropertyName varchar(100)

MaterialsProperties
MaterialID
物業ID
PropertyValue varchar(3000)

該應用程序的基本功能是搜索功能:最終用戶可以通過輸入以下查詢來搜索材料:

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

猜猜它如何在具有近200萬條記錄的MaterialsProperties表上執行。

數據庫最初是在SQL Server 2000下創建的,后來又遷移到SQL Server 2005

如何更好地做到這一點?

您可以考慮按類型將您的MaterialsProperties表分離,例如,分為IntMaterialPropertiesCharMaterialProperties等。這將:

  • 對數據進行分區。
  • 允許對整數(或其他數字)類型的查找進行更快的查找。
  • 潛在地降低存儲成本。

您還可以在Properties引入Type列,以用於確定要查詢的MaterialProperties表。 該列還可以用於驗證用戶輸入的類型正確,從而無需查詢給定的“不良”輸入。

  1. 由於用戶可以輸入自己的屬性名稱,因此我想每個查詢都將涉及對屬性表的掃描(在您的示例中,我需要找到[inspectionDate]的propertyid)。 如果屬性表很大,則聯接也將花費很長時間。 您可以嘗試通過對屬性ID進行規范化和存儲來進行優化。 這將是MaterialsProperties表中的一個脫標的列。
  2. 您可以嘗試將屬性類型(int,char等)添加到materialsproperty表中,然后在該類型上對該表進行分區。
  3. 查看用於查詢優化的對象關系映射/實體屬性值模型技術。
  4. 由於您已經有很多數據(200萬條記錄),因此需要進行一些數據挖掘,以查看是否存在許多材料的重復屬性組。 您可以將它們放在一種模式中,其余的作為EAV表。 在此處查看詳細信息: http : //portal.acm.org/citation.cfm?id=509015&dl=GUIDE&coll=GUIDE&CFID=49465839&CFTOKEN=33971901

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM