第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正確設(shè)計EAV數(shù)據(jù)庫以獲取歷史數(shù)據(jù)

正確設(shè)計EAV數(shù)據(jù)庫以獲取歷史數(shù)據(jù)

胡子哥哥 2020-02-02 15:18:48
介紹我一直在閱讀有關(guān)EAV數(shù)據(jù)庫的信息,而大多數(shù)缺點似乎都與EAV設(shè)計確實非常糟糕或很難從數(shù)據(jù)中生成報告有關(guān)。通常,當您看到人們抱怨EAV時,他們使用少于三個的表來嘗試復(fù)制RDBMS中單獨的表+列的功能。有時,這意味著將所有內(nèi)容(從小數(shù)到字符串)都存儲在單個TEXT值列中。EAV還會破壞數(shù)據(jù)完整性的安全保護措施,如果您不小心的話,這可能會很糟糕。但是,EAV確實提供了一種輕松的方式來跟蹤歷史數(shù)據(jù),并允許我們在SQL和鍵值存儲系統(tǒng)之間來回移動系統(tǒng)的某些部分。如果我們根據(jù)類型區(qū)分不同的實體屬性該怎么辦。除了與特定屬性和實體相關(guān)的正確索引值之外,這還使我們?nèi)匀豢梢蕴幚韇elongsTo,Has,HasMany和HasManyThrough關(guān)系??紤]以下兩個基本實體products (price -> decimal, title -> string, desc -> text, etc...)    attributes        options            [...]        int        datetime        string        text        decimal        relation            [id,foreign_key]users (gender -> options, age -> int, username -> string, etc...)    attributes        options            [...]        int        datetime        string        text        decimal        relation            [id,foreign_key]RDBMS架構(gòu)設(shè)計眾所周知,用戶資料和產(chǎn)品是世界上最多樣化的產(chǎn)品。每個公司處理它們的方式都不一樣,并且針對他們的需求具有不同的“列”或“屬性”。以下是如何處理多個(嵌套和/或關(guān)系)實體的視圖。想法是,對于每個實體都有此主屬性表,然后該主表指定如何查找和解釋這些值。這使我們能夠處理特殊情況,例如指向其他實體的外鍵以及諸如“選項”或十進制數(shù)字之類的東西。查詢樣例首先,實體是什么“類型”?(用戶,帖子,評論等。)SELECT * FROM entity_type et LEFT JOIN entity e ON e.entity_type_id = et.id WHERE e.id = ?接下來,該實體的屬性是什么?(表屬性)SELECT * FROM attr WHERE entity_id = ?接下來,此實體的屬性中存在哪些值?(attr _ ###表)SELECT * FROM attr_option, attr_int, attr_relation, attr_text, ... WHERE entity_id = ?vsSELECT * FROM attr_option WHERE entity_id = ? if( ! multiple) ORDER BY created_at DESC LIMIT 1SELECT * FROM attr_int WHERE entity_id = ? ORDER BY created_at DESC LIMIT 1SELECT * FROM attr_relation WHERE entity_id = ? ORDER BY created_at DESC LIMIT 1SELECT * FROM attr_text WHERE entity_id = ? ORDER BY created_at DESC LIMIT 1...該實體存在什么關(guān)系?假設(shè)我們有一個ID為34的“發(fā)布”實體,并且我們想要它的“注釋”(entity_type = 2),這可以允許我們在產(chǎn)品實體上獲取評論實體ID:SELECT * FROM entity AS eLEFT JOIN attr_relation AS ar ON ar.entity_id = e.idWHERE ar.entity_id = 34 AND e.entity_type = 2;除了多個查詢(無論如何,鍵值存儲都需要這些查詢)之外,這種方法還會存在哪些問題?
查看完整描述

3 回答

?
慕姐4208626

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。


查看完整回答
反對 回復(fù) 2020-02-02
?
人到中年有點甜

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,但至少你可以模擬UNIQUEFOREIGN KEY在一個漂亮的傳統(tǒng)方式。


查看完整回答
反對 回復(fù) 2020-02-02
?
慕妹3242003

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)。


查看完整回答
反對 回復(fù) 2020-02-02
  • 3 回答
  • 0 關(guān)注
  • 1226 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號