我會避免EAV,除非我正在建立一個有成千上萬種產品的醫療信息庫。類表繼承是一個適當的解決方案,在運行時改變模式並不是什麼壞主意。
假設你正在建立一個網上商店,你有不同的產品具有不同的屬性。通常,產品正在使用一組屬性。通過使用Class Table Inheritance模式,您可以爲每個產品組使用一個表,繼承具有常見產品屬性的公共表。當需要一個新的屬性,你有兩個選擇:
- 改變安放臺和帶有屬性名稱
- 創建一個新的集(即新表)與新列添加一個新的列並設置當前產品設置爲繼承新產品,從而添加新的屬性。
在運行時更改表可能確實會導致問題,因爲在更改過程中發生鎖定。然而,從MySQL 5.6開始,程序員可以指定一個LOCK類型,例如LOCK = NONE,也可以ALTER ONLINE | OFFLINE。顯然,DB供應商正在朝這個方向努力,以便在運行期間進行數據庫更改。
表鎖定問題也可以避免/最小化。鎖定問題通常發生在改變巨大的表格(即100k +記錄)時。但是,繼承允許分配不同集合中的產品,因此每個表的記錄數量相對較少。
例如,如果我們有10種不同類型的產品,我們有10個不同的表格。假設我們每種類型都有10000個產品,這意味着我們有超過10萬個產品,但是在一個集合中添加一個新屬性實際上只會在具有10000個行的表中添加一個新列。在具有10k行的表中添加新列的時間會少於一秒,因此在處理類表時繼續改變數據庫模式繼承真的是個壞主意?
我很樂意在這裏聽到更多意見。多謝你們。
謝謝本。我需要在下週推出這個特定的項目,根據你的回答,我會堅持採用EAV方法,但面向文檔看起來像是最好的解決方案。有人能夠評論我提出的模式嗎? – 2010-08-05 02:10:20