为了制作文档管理系统,我正在研究像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中存储所有可变属性。
这指出了为什么存在面向文档的数据库。它们旨在解决关系范式选择不支持的问题。但面向文档的数据库不能完成关系数据库所做的一些很酷的事情,例如参照完整性和数据类型一致性。