3 回答

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

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

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