2011-12-20 17 views
1

我有一個「變量」結構放在表DB中。通過「變量」,我指的是一系列夫婦字段/值,其中字段的「種類」決定了值的類型,我不清楚字段順序,我不知道字段可以重複多少次。有時候一組領域會重複多次(這是一個財政模型)。以Web形式讀取的DB表中的變量結構

附加要求:我應該將這些變量數據映射到網頁表單中,處理一些CRUD工作。 JQuery-ui,Struts 2,Hibernate。首選DBMS:MySQL。

的解決方案,我認爲:

  1. 垂直表。我可能會遇到一些性能問題,我可以使用物化視圖來解決這個問題,當我需要大量數據處理時,「透視」列中的行。這個方向還沒有走,因爲它似乎對於開發來說非常昂貴。
  2. LOB字段。將我的列放到其中一個列中,可能有一個「映射」表來解碼每列。我的想法是將可搜索字段作爲「真實」列來提取,以便在LOB中留下不太有趣的數據,而不會產生性能問題。
  3. 或更好2a。在LOB字段中使用xml。這對於更舒適地打包/解包數據非常有用,特別是必須將數據映射到Web表單。

您怎麼看?還有更多,有沒有辦法從xml字段創建自動視圖?或者更好地將這些數據映射到Web表單?我懷疑Hibernate Tools在我描述的任何情況下都不起作用。

我希望我已經清楚,它仍然是一個有點混亂,甚至對我:)

+1

我已經使用了1,即使物化視圖也是一種痛苦。它們變得巨大並且容易出錯(在其中一個條件中,使用DBA ='SIBLING'而不是='兄弟')。 – Stefan 2011-12-20 18:58:45

回答

0

你的選項1是Entity-Attribute-Value反模式。

見我的回答Product table, many kinds of product, each product has many parameters和替代品和一些原因,EAV是錯誤的,至少對於關係數據庫(我蓋EAV在我的書,SQL Antipatterns: Avoiding the Pitfalls of Database Programming)我的博客文章EAV FAIL

另請閱讀本文,瞭解類似的結構幾乎註定了公司:Bad CaRMa

您的選擇2 & 3與How FriendFeed uses MySQL to store schema-less data中描述的類似。我不知道ORM是否有自動的方式來爲你維護這個結構。您確實需要將倒排索引表與您的LOB數據保持同步。

+0

我不會稱之爲反模式。您鏈接的維基百科文章列出了使用EAV的理由。 – Stefan 2011-12-20 19:01:42

+0

除了丟失SQL的許多功能,例如數據類型,約束和表標題。您必須自己在應用程序代碼中實現元數據,而不是依靠RDBMS來強制執行結構。 – 2011-12-20 19:17:48

+0

我同意這些。但是,對於列中的XML,您遇到類似的問題,在涉及報告時更加糟糕。我認爲有效的EAV使用情況並不符合反模式。它像弱和強大的類型語言。兩者都有其不同的用途。 – Stefan 2011-12-20 19:28:04