一直在使用Mongodb和Solr/Lucene,我開始懷疑爲什麼關係數據庫的多值字段(通常)被認爲是一個壞主意?爲什麼多值字段在關係數據庫中是一個壞主意
我瞭解關係數據庫的理論基礎和normalization。然而,在實踐中,我遇到了很多使用情況,最終我使用了鍵值對的元表來補充主表,比如在標記的情況下,我希望不必多次連接查找數據。或者需求突然從支持單個作者變爲每篇文章的多位作者。
那麼,有多值字段或供應商選擇不支持它,因爲它不是SQL標準的一部分有什麼缺點?
一直在使用Mongodb和Solr/Lucene,我開始懷疑爲什麼關係數據庫的多值字段(通常)被認爲是一個壞主意?爲什麼多值字段在關係數據庫中是一個壞主意
我瞭解關係數據庫的理論基礎和normalization。然而,在實踐中,我遇到了很多使用情況,最終我使用了鍵值對的元表來補充主表,比如在標記的情況下,我希望不必多次連接查找數據。或者需求突然從支持單個作者變爲每篇文章的多位作者。
那麼,有多值字段或供應商選擇不支持它,因爲它不是SQL標準的一部分有什麼缺點?
主要缺點是查詢偏差。這種數據庫傾向於用一種特定的查詢來設計的現象,並且在需要編寫其他查詢時很難處理。
假設你有學生和課程,並且你對所有這些進行建模,這樣你就可以在單個表中的單行中說「John Doe需要{法語,代數,關係理論}」和「Jane Doe需要{德語,功能計算,關係理論}「。
可以很容易地查詢「所有課程的後面跟着......」,但試着設想出什麼才能產生「遵循關係理論的所有學生是什麼」的答案。
試想所有的東西系統本身應該是做給這樣的查詢(如果有可能將它寫)進行合理的任何機會......
我認爲這有其根源在於沒有簡單的標準方法將集合映射到關係世界中的列。一個mutifield值基本上是一個簡單的集合(數組的字符串在大多數使用情況下),這很難表示爲列。有些RDBMS通過使用分隔符支持這一點,但是再一次,即使DB驅動程序允許您在關係數據庫中使用多值字段,它也開始感覺像反模式。像MongoDB這樣的數據庫依靠類似JSON的結構來定義數據,在這些數據中集合很容易被映射和檢索。
查詢偏見是假設SQL是一個好的查詢語言。事實上,它是有時候是一種優秀的查詢語言,但它從來沒有一個適合所有人。多值數據庫允許您打包多個值並處理「替代視角」查詢。 MVDB的示例:UniData http://u2.rocketsoftware.com/products/u2-unidata,OpenInsight http://www.revelation.com/,Reality http://www.northgate-is.com/。還有很多其他的。 他們的查詢語言支持你正在尋找的東西。
關係理論完全允許任何屬性爲任何類型,包括數組類型,元組類型或關係類型。 –
同意,理論上它確實如此。 – lobster1234