我正在使用PHP和PostgreSQL重建應用程序(此處爲單獨的開發人員)。對於大多數數據,我使用每個屬性具有多個列的表進行存儲。但是,我現在開始構建內容存儲的一些表格。這種情況下的內容是多個部分,每個部分包含不同的數據集;一些數據是常見的,共享的(以及外鍵)和其他數據是非常獨特的。在應用程序的當前迭代,我們有一個表的結構是這樣的:EAV與基於列的數據組織對於我的數據
id | project_name | project_owner | site | customer_name | last_updated
-----------------------------------------------------------------------
1 | test1 | some guy | 12 | some company | 1/2/2012
2 | test2 | another guy | 04 | another co | 2/22/2012
現在,這個工作 - 但它很難得到維護的幾個原因。添加新列(很少發生)需要修改數據庫表。審計/歷史記錄追蹤需要一個單獨的表格,用於將附加信息映射到主表格 - 如果主表格已更改,還需要進行修改。最後,有很多列 - 在一些表中超過100列。
我一直在頭腦風暴的替代方法,包括把一張大桌子分成幾個小桌子。這引入了我認爲也會導致問題的其他問題。
我目前正在考慮的方法似乎被稱爲EAV模型。我有一張如下所示的表格:
id | project_name | col_name | data_varchar | data_int | data_timestamp | update_time
--------------------------------------------------------------------------------------------------
1 | test1 | site | | 12 | | 1/2/2012
2 | test1 | customer_name | some company | | | 1/2/2012
3 | test1 | project_owner | some guy | | | 1/2/2012
...等等。這有一個好處,我永遠不會更新,總是插入。數據不會被覆蓋,只會被添加。當然,桌子最終會變得相當大。我有一個'索引'表列出了項目,並用於引用'數據'表。不過,我覺得我錯過了這種方法的一些大事。它會縮放嗎?我原本想做一個簡單的鍵 - >值類型表,但意識到我需要能夠在表中有不同的數據類型。這似乎是可管理的,因爲我使用的數據庫抽象層將包含一個從正確列中選擇數據的類型。
我是否爲自己做了太多工作?我應該堅持一個簡單的桌子和一大堆列嗎?
我可能會嘗試使用第一種解決方案來儘可能多地識別公共列,並使用外部索引或完全離開SQL解決方案並轉向NoSQL文檔存儲(如MongoDb,CouchDb等)。我真的不喜歡第二種選擇,這是災難性的。 – mobius 2012-01-18 22:47:17
Postgres有一個很好的擴展名爲hstore,這是一個比EAV更好的解決方案。 http://www.postgresql.org/docs/current/static/hstore.html它是Postgres中的NoSQL;) – 2012-01-18 23:19:42