2013-08-28 57 views
7

我一直在爲即將到來的項目進行大量的數據庫設計研究。替代EAV模型vs混合策略與簡化和改進版本

這是典型的inner platform problem,我們的客戶基本上想要無限定製,並能夠在實體上創建表單和屬性,從最終用戶收集值,並能夠在圖表上顯示收集到的信息。

這將是臨牀醫生用來幫助監測患者的東西,爲什麼即使使用EAV也是一個問題,我們需要爲不同的試運行收集不同的信息。有時候可能是他們那天吃的東西。其他可能是血糖或血壓(這實際上是兩個數字),而其他情況可能是多個問題(你今天的疼痛情況如何,從1-10開始?),所有這些想法都是我們永遠不會知道的推進最終客戶的要求究竟是什麼,或者真正接受的價值是什麼。

我們還會在整個計劃中一致地繪製這些數據,並在不太經常的基礎上生成更大的報告。

理想情況下,我希望能夠儘可能多地編寫代碼,因爲我們使用的是SQL,並且堅持關係數據庫最佳實踐將簡化數據庫設計和應用程序設計(這兩者都是我「寫作)。

我們正在做一些試運行,我的第一個想法是從客戶那裏獲得儘可能多的信息,硬編碼數據庫中的表,然後從那裏進行編譯。如果我們發現我們需要使用一個屬性表和一個attribue_value表來收集這些屬性(以及有趣的實現表單生成器,比如下拉菜單,因此需要下拉菜單選項和驗證),我們可以這樣做後來啓動。

我已經經歷了基本上所有相關的堆棧溢出帖子;大多數人說避免EAV,更好地理解應用程序的需求,並且在某些時候,如果客戶真的需要EAV實施,那麼繼續做下去。

  • 有沒有人曾經使用混合動力車型?你可以討論它嗎?

  • 有沒有人成功實施過EAV模型,你可以討論它嗎?

  • 你有沒有做過類似的決定,決定不實施一個看起來可能是候選人的項目的EAV?結果如何?

這裏有一些有趣的閱讀,我一路上發現:

http://decipherinfosys.wordpress.com/2007/01/29/name-value-pair-design/ Storing time-series data, relational or non? Database EAV Pros/Cons and Alternatives Alternatives to Entity-Attribute-Value (EAV)?

And the link that really gave me a ton of insight.

+2

[更多食物的思考](http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back) - 從幻燈片16開始進行EAV討論。 –

+3

另請參閱我的演示文稿[可擴展數據建模](http://www.slideshare.net/billkarwin/extensible-data-modeling)瞭解不同備選方案的優缺點。 –

+0

對於任何人來說這個 - 我讀了這個評論主題中的兩個鏈接。他們都寫得很好,信息豐富,並強烈建議,如果你踩着這條道路。 – Squadrons

回答

0

經過一番思考,並考慮到客戶的需求/請求,使用EAV模型在這裏是正確的答案。

在做了一些更多的研究之後,我決定使用Postrgresql並充分利用其HSTORE數據類型,該類型允許在單個字段中存儲,搜索和索引鍵值對。

這裏是一紙標杆hstore VS EAV: http://wiki.hsr.ch/Datenbanken/files/Benchmark_of_KVP_vs.hstore-_doc.pdf

上述基準紙張hstore VS的EAV表,hstore出來遙遙領先。

我們認爲是具有覆蓋所有的基礎任務表的另一種選擇:

ID,名稱,值1,值... note_1,notes_2

很明顯的是,想到了我的命了一下里面,所以我要麼使用task_type屬性表:

任務由管理員爲用戶規定並且具有task_type,task_type_attributes用於該類型的所有任務(即,爲練習任務定義該任務,我們希望能夠存儲有關鍛鍊強度,鍛鍊時間等信息)。

一旦用戶提出任務,他們會將task_attributes看作填充字段。他們進入這些領域,他們進入ATTRIBUTE_VALUE然後與患者的task_entry(如果他們完成了它,忽略它也指出,等等)

task_attributes

  • ID相關聯
  • task_type_id
  • 屬性
  • attribute_value_type(用於在應用程序端生成所需的字段 - 即,知道有一個下拉與文本輸入)
  • MIN_VALUE
  • MAX_VALUE
  • 需要

tasK_entry_values

  • task_entry_id
  • task_type_attribute_id

希望這可能對某人有用。我也會對這個設計的任何和所有批評/反饋感興趣。

+1

只需確保您使用的測試數據在大約一年內大致與數據庫大小一起加載測試。你真的不知道那時你必須重組。 – HLGEM