【问题标题】:How use a relational database as a document-based one?如何将关系数据库用作基于文档的数据库?
【发布时间】:2009-12-19 05:21:39
【问题描述】:
为了制作一个文档管理系统,我正在研究像 MongoDB 这样的文档存储,但是因为我对常规数据库(Firebird、Sql Server、Mysql)有更多的经验,我想知道是否可以在关系模型之上建立一个文档存储一个。
文档存储的优点,架构更少:
- 非常适合存储有关文件的任意元数据的任务
- 无需升级架构
- 根据 mongodb,BLOB 类视频表现出色
- 更容易扩展
但是有一个关系:
- 参考完整性
- 更好的工具
- 更能抵御崩溃和损坏
- SQL
那么,在这种情况下,关系数据库如何工作?
【问题讨论】:
标签:
mysql
database-design
architecture
nosql
firebird
【解决方案1】:
考虑 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 中。
这指出了为什么存在面向文档的数据库。它们旨在解决关系范式选择不支持的问题。但是面向文档的数据库并没有关系数据库所做的一些很酷的事情,例如参照完整性甚至数据类型一致性。
【解决方案2】:
一个简单的 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 属性的文档。