如何使用关系数据库作为基于文档的数据库?

时间:2009-12-18 19:33:02

标签: mysql database-design architecture nosql firebird

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

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

  • 非常适合存储有关文件的任意元数据的任务
  • 无需升级架构
  • 根据mongodb,BLOB的优秀表现如视频
  • 易于扩展性

但是有一个关系:

  • 参考诚信
  • 更好的工具
  • 更加安静的崩溃&损坏
  • SQL

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

2 个答案:

答案 0 :(得分: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中的所有变量属性内容。

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

答案 1 :(得分: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属性的文档。