1

我已經有很多年的編程關係數據庫中,但現在所遇到的不尋常的和棘手的問題:動態數據庫/鍵 - 值/實體 - 核心價值Dillemma

我建立,需要有非常的應用快速和容易定義的實體(由用戶)。然後可以創建,更新,刪除這些實體的實例等。

我可以考慮兩個選項。

選項1 - 動態創建的表

第一個選項是寫一個引擎動態地生成的表,將數據插入到這些。然而,這會變得非常棘手,因爲每個查詢還需要是動態的,或者至少動態創建存儲過程等

選項2 - 實體 - 鍵 - 值模式

這是唯一的現實的選擇,我能想到的,在這裏我有5個表結構:

EntityTypes

EntityTypeID INT

EntityTypeName爲nvarchar(50)

實體

ENTITYID INT

EntityTypeID INT

域類型

FieldTypeID詮釋

FieldTypeName爲nvarchar(50),

SQLTYPE INT

FieldValues

ENTITYID INT

FIeldID INT

價值爲nvarchar(MAX)

字段

FieldID INT

字段名爲nvarchar(50)

FieldTypeID詮釋

的 「FieldValues」 表會工作有點像數據倉庫事實表,以及我所有的插入/更新將通過填充一個工作「鍵/值「表值參數並將其傳遞給SPROC(以避免多次插入/更新)。

所有的表都會被嚴重索引,我最終會做很多自連接來獲取數據。

我已經讀了很多關於密鑰/數值數據庫的壞處,但對於這個問題,它似乎仍然是最好的。

現在我的問題!

  • 任何人都可以提出另一種方法或模式以外的這兩個選項嗎?
  • 將選擇兩個用於中型數據集(100萬行最大)是可行的?
  • 是選項2,我可以用有進一步的優化?

任何方向和建議非常感謝!

+0

圍繞一齣戲後,我有蒙戈與蒙戈/ C#庫運行。對於這個特殊的例子,noRM庫有點過於強烈,因爲我將使用諸如db.getCollection(「Contacts」)之類的命令。 感謝pablochan指引我朝着正確的方向前進,並期待noSQL的新冒險! – 2011-12-23 14:05:25

回答

2

個人而言,我只想用一個 「NOSQL」(鍵/值)數據庫一樣MongoDB

但是如果你需要使用關係數據庫選項二是要走的路。這種模型的一個很好的例子是Alfresco Data Dictionary(Alfresco是一個企業內容管理系統)。它的設計與您所描述的類似,但它們有多個字段值列(針對數據庫中可用的每種簡單類型)。如果你添加一個好的緩存系統(例如Ehcache),它應該可以正常工作。

+0

感謝您的評論。我沒有聽說過noSQL數據庫,MonogDB看起來很有意思。 我將貫穿整個教程,看看我是否看到了一條前進的道路。你知道它是否可以很好地擴展,並適用於多用戶Web應用程序?我在C#中使用ASP.NET MVC3。 – 2011-12-23 01:27:16

+0

不幸的是,我沒有MongoDB的「真實生活」體驗,所以我不能告訴你。其中一個問題是寫操作至少在這個時候會阻塞整個數據庫(http://www.mongodb.org/display/DOCS/How+does+concurrency+work),所以你應該明確地閱讀它。還有其他的noSQL數據庫,所以你也可以檢查它們。 – pablochan 2011-12-23 08:38:20

1

這聽起來像這可能是在尋找一個問題的解決方案。你的域可以重構嗎?如果不是 - 他們仍然希望。

  • 選項2的可伸縮性將取決於自定義對象的寬度。可以動態創建多少個字段?當每個實體有100個字段時,有100萬個實體可能會拖累...有效的索引可以使性能可以承受。

  • 另一種選擇 - 你可以有一個數據表,有幾個字段,幾個雙字段和幾個整數字段。例如,一張帶有String1, String2, String3, Int1, Int2, Int3的表格。第二個表具有定義用戶對象的行並映射「CustomObjectName」=> String1等。存儲過程的閱讀INFORMATION_SCHEMA和一些動態SQL將能夠讀取架構表並返回一個強類型的記錄...

  • 另一個選項(最新版本的SQL Server),將存儲一行的id,類型名稱以及包含包含對象數據的XML文檔的XML字段。在MS Sql Server中,可以直接查詢,甚至可以根據模式進行驗證。

0

從個人的角度來說,我會花時間來定義儘可能多的屬性,因爲你可以使用任何東西而不是使用EAV。你當然知道一些屬性。那麼你只需要EAv就可以完成客戶特定的事情。

但是,如果所有的都必須是EAV,那麼nosql數據庫是要走的路。或者你可以使用一個關係數據庫來處理一些東西,其餘的使用nosql數據庫。