【问题标题】: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 属性的文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        • 2015-09-20
        • 2019-04-21
        • 1970-01-01
        相关资源
        最近更新 更多