3 回答

TA貢獻1852條經驗 獲得超7個贊
一個EAV“數據庫” [原文如此]是字面上 數學 直截了當一個未記錄的描述在數據庫和其元數據的三元組,沒有功能tablulate關系,或查詢的關系,或查詢的元數據,或類型檢查或維護完整性,或優(yōu)化,或原子交易,或控制并發(fā)。
軟件工程原理規(guī)定,合理的EAV數據庫的使用完全由定義適當的抽象(類型,運算符,過程,解釋器,模塊)組成,以重建DBMS的功能。
從一個人的EAV三元組及其含義到(碎片化的)數據庫描述的映射的機械性質使此操作易于顯示。
用Greenspun來解釋,任何足夠復雜的EAV項目都包含一個臨時的,非正式指定的,漏洞百出的緩慢實現的DBMS一半。
我再說一遍:EAV是數據庫及其元數據的三元組的無文檔描述,沒有DBMS。僅對已證明DDL解決方案不能滿足性能要求并且EAV解決方案可以而且值得的數據庫部分使用EAV。

TA貢獻1895條經驗 獲得超7個贊
這是此設計的一些問題。
您將如何查詢給定實體的所有整數屬性的當前值?
您將如何建模應該是的屬性
NOT NULL
?也就是說,請確保給定屬性是其實體的必需屬性,并且沒有該屬性的值就無法創(chuàng)建該實體。您將如何為UNIQUE列建模?假設您可以更改屬性的值,然后將其更改回原始值。
您如何支持使用整數主鍵以外的其他內容引用實體的外鍵?
如何將給定屬性限制為查找表中的值集?
解決其中大多數問題的唯一方法是使用應用程序代碼。這就是EAV的問題:您最終重新發(fā)明了許多我們認為理所當然的SQL約束。這是“ 內部平臺效應”反模式的一個示例:
平臺內部的影響是軟件架構師傾向于創(chuàng)建可定制的系統(tǒng),以使其成為他們正在使用的軟件開發(fā)平臺的副本,并且通常是較差的副本。
第六范式不是EAV。在第六范式中,每個屬性而不是每種數據類型都需要一個單獨的表。您可以使用具有適當名稱和數據類型的常規(guī)列。將此屬性存儲在不同的表中是使您能夠存儲歷史修訂的能力。
這意味著你仍然不能模擬NOT NULL
在6NF,但至少你可以模擬UNIQUE
和FOREIGN KEY
在一個漂亮的傳統(tǒng)方式。

TA貢獻1824條經驗 獲得超6個贊
“我一直在閱讀有關EAV數據庫的信息,而大多數的短期缺點似乎與確實,非常糟糕的EAV設計或從數據生成報告的難度有關。”
生成報告的困難固有地且不可避免地源于EAV DB所代表的事實:“人XYZ的屬性BIRTHDATE的值為...”“人XYZ的屬性DECEASEDATE的值為...”等。
這不是最終用戶想到的用于承載有關人XYZ(或任何其他人)信息的數據結構的典型形式,在最終用戶和數據庫之間的某個地方是人為地,是附加的轉換(非常類似于旋轉,盡管不完全是100) %) 是必要的。每個其他轉換都是潛在的錯誤和性能損失的來源。
“通常,當您看到人們抱怨EAV時,他們使用少于三個表來嘗試在RDBMS中復制單獨的表+列的功能。有時這意味著將十進制到字符串存儲在單個TEXT值列中?!?/p>
這只是EAV的缺點之一。屬性級類型約束變得更難定義或無法定義。但是除此之外。
“ EAV還會破壞數據完整性的安全保護措施,如果您不小心的話,這將是非常糟糕的?!?/p>
這與報告生成的難度完全相關,這與表達有意義的查詢的難度完全相同,而與表達構成某些特定規(guī)則的場景的難度則完全相同。
“但是,EAV確實提供了一種輕松的方式來跟蹤歷史數據,并允許我們在SQL和鍵值存儲系統(tǒng)之間來回移動系統(tǒng)的一部分?!?/p>
BS和baloney。嚴格應用的EAV將使時間信息與其他任何“常規(guī)”屬性一樣遠離其所應用的對象。如果您不這樣做,那么您將不再(嚴格)應用EAV。參見Bill Karwin的回答:EAV!= 6NF !!!!!!!!! 6NF仍然具有任何其他“常規(guī)”數據庫所具有的所有“結構”,EAV的全部作用(請參閱philip的回答和Bill的“內部平臺”一詞)有效地從數據庫中刪除了該結構。
添加回答
舉報