1

为了制作一个文档管理系统,我正在研究像 MongoDB 这样的文档存储,但是因为我对常规数据库(Firebird、Sql Server、Mysql)有更多的经验,所以我想知道是否可以在关系数据库之上建立一个文档存储模型。

文档存储的优点,架构少:

  • 非常适合存储有关文件的任意元数据的任务
  • 无需升级架构
  • 根据 mongodb,BLOB 类视频的出色表现
  • 更容易的可扩展性

但是有一个关系:

  • 参考完整性
  • 更好的工具
  • 更能抵御崩溃和腐败
  • SQL

那么,在这种情况下如何使用关系数据库呢?

4

2 回答 2

5

考虑 Martin Fowler 的序列化 LOB模式:

CREATE TABLE Documents (
  documentid SERIAL PRIMARY KEY,
  -- fixed relational attributes ...
  document TEXT -- contains XML, YAML, whatever
);

您可以将任何具有动态属性的半结构化数据放入document列中。您只是不能轻松地使用 SQL 谓词来搜索或按该 blob 中的字段排序。但无论如何你都做不到——变量属性是一个非关系概念,无论如何在 SQL 中支持它们都是很尴尬的。

您可以使用混合方法,将一些固定属性存储在常规列中,并将所有可变属性内容存储在 blob 中。

这指出了为什么存在面向文档的数据库。它们旨在解决关系范式选择不支持的问题。但是面向文档的数据库并没有做一些关系数据库做的很酷的事情,比如引用完整性甚至数据类型的一致性。

于 2009-12-18T19:42:20.903 回答
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 属性的文档。

于 2009-12-18T21:21:39.797 回答