为了制作一个文档管理系统,我正在研究像 MongoDB 这样的文档存储,但是因为我对常规数据库(Firebird、Sql Server、Mysql)有更多的经验,所以我想知道是否可以在关系数据库之上建立一个文档存储模型。
文档存储的优点,架构少:
- 非常适合存储有关文件的任意元数据的任务
- 无需升级架构
- 根据 mongodb,BLOB 类视频的出色表现
- 更容易的可扩展性
但是有一个关系:
- 参考完整性
- 更好的工具
- 更能抵御崩溃和腐败
- SQL
那么,在这种情况下如何使用关系数据库呢?
为了制作一个文档管理系统,我正在研究像 MongoDB 这样的文档存储,但是因为我对常规数据库(Firebird、Sql Server、Mysql)有更多的经验,所以我想知道是否可以在关系数据库之上建立一个文档存储模型。
文档存储的优点,架构少:
但是有一个关系:
那么,在这种情况下如何使用关系数据库呢?
考虑 Martin Fowler 的序列化 LOB模式:
CREATE TABLE Documents (
documentid SERIAL PRIMARY KEY,
-- fixed relational attributes ...
document TEXT -- contains XML, YAML, whatever
);
您可以将任何具有动态属性的半结构化数据放入document
列中。您只是不能轻松地使用 SQL 谓词来搜索或按该 blob 中的字段排序。但无论如何你都做不到——变量属性是一个非关系概念,无论如何在 SQL 中支持它们都是很尴尬的。
您可以使用混合方法,将一些固定属性存储在常规列中,并将所有可变属性内容存储在 blob 中。
这指出了为什么存在面向文档的数据库。它们旨在解决关系范式选择不支持的问题。但是面向文档的数据库并没有做一些关系数据库做的很酷的事情,比如引用完整性甚至数据类型的一致性。
一个简单的 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 属性的文档。