爲了製作文檔管理系統,我正在研究像MongoDB這樣的文檔商店,但是因爲我對常規數據庫(Firebird,Sql Server,Mysql)有更多的經驗,我想知道是否有可能在關係數據庫。如何使用關係數據庫作爲基於文檔的關係數據庫?
有關文檔存儲的優勢,架構減:
- 合身約文件存儲任意元數據的任務
- 無需升級模式
- 據MongoDB中,對BLOB性能優良如視頻
- 更方便的可擴展性
但隨着關係之一:
- 的借鑑完整性
- 更好的工具
- 更是輕快崩潰&腐敗
- SQL
那麼,如何可以工作在這種情況下,關係數據庫?
爲了製作文檔管理系統,我正在研究像MongoDB這樣的文檔商店,但是因爲我對常規數據庫(Firebird,Sql Server,Mysql)有更多的經驗,我想知道是否有可能在關係數據庫。如何使用關係數據庫作爲基於文檔的關係數據庫?
有關文檔存儲的優勢,架構減:
但隨着關係之一:
那麼,如何可以工作在這種情況下,關係數據庫?
一個簡單的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屬性的文檔。
考慮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中存儲所有可變屬性。
這指出了爲什麼存在面向文檔的數據庫。它們旨在解決關係範式選擇不支持的問題。但面向文檔的數據庫不能完成關係數據庫所做的一些很酷的事情,例如參照完整性和數據類型一致性。