2009-12-18 59 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中存储所有可变属性。

这指出了为什么存在面向文档的数据库。它们旨在解决关系范式选择不支持的问题。但面向文档的数据库不能完成关系数据库所做的一些很酷的事情,例如参照完整性和数据类型一致性。