2009-10-21 18 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。

相關問題