2009-12-18 26 views
1

爲了製作文檔管理系統,我正在研究像MongoDB這樣的文檔商店,但是因爲我對常規數據庫(Firebird,Sql Server,Mysql)有更多的經驗,我想知道是否有可能在關係數據庫。如何使用關係數據庫作爲基於文檔的關係數據庫?

有關文檔存儲的優勢,架構減:

  • 合身約文件存儲任意元數據的任務
  • 無需升級模式
  • 據MongoDB中,對BLOB性能優良如視頻
  • 更方便的可擴展性

但隨着關係之一:

  • 的借鑑完整性
  • 更好的工具
  • 更是輕快崩潰&腐敗
  • SQL

那麼,如何可以工作在這種情況下,關係數據庫?

回答

3

一個簡單的MySQL例子:

CREATE TABLE Docs (
    id INT, 
    attr VARCHAR(255), 
    value BLOB, 
    PRIMARY KEY (id, attr), 
    KEY attr_index (attr) 
) 

一旦你有,你可以將任何屬性添加到文檔類的東西在任何有價值的東西,你可以使用自聯接在文檔表做複雜的查詢,如:

SELECT * FROM Docs AS d1, docs AS d2 WHERE d1.attr = "foo" AND d2.attr = "bar" 

它返回具有foo和bar屬性的文檔。

5

考慮Martin Fowler的Serialized LOB模式:

CREATE TABLE Documents (
    documentid SERIAL PRIMARY KEY, 
    -- fixed relational attributes ... 
    document TEXT -- contains XML, YAML, whatever 
); 

你可以把具有動態屬性的任何半結構化數據到document列。您不能輕鬆使用SQL謂詞來搜索或按該blob中的字段進行排序。但是反正你不能這麼做 - 變量屬性是一個非關係的概念,無論如何,在SQL中支持它們都很尷尬。

您可以使用混合方法,在常規列中存儲一些固定屬性,並在blob中存儲所有可變屬性。

這指出了爲什麼存在面向文檔的數據庫。它們旨在解決關係範式選擇不支持的問題。但面向文檔的數據庫不能完成關係數據庫所做的一些很酷的事情,例如參照完整性和數據類型一致性。