数据库:平面与嵌套数据

时间:2015-12-01 22:18:44

标签: database database-schema

我想将数据存储在可以嵌套的数据库中,如

[
{
  id: 'deadbeef',
  url: 'https://lol.cat/1234',
  revisions: [
    {
      id: '1',
      title: 'foo',
      authors: ['lol', 'cat'],
      content: 'yadda yadda',
      // ...
    },
    {
      id: '2',
      title: 'foo',
      authors: ['lol', 'cat'],
      content: 'yadda yadda bla',
      // ...
    },
    // ...   
  ]
},
// ...
]

(可以想象这里有更多关卡。)

或者,可以像

那样平整地组织相同的数据
[
{
  documentId: 'deadbeef',
  url: 'https://lol.cat/1234',
  id: '1',
  title: 'foo',
  authors: ['lol', 'cat'],
  content: 'yadda yadda',
  // ...
},
{
  documentId: 'deadbeef',
  url: 'https://lol.cat/1234',
  id: '2',
  title: 'foo',
  authors: ['lol', 'cat'],
  content: 'yadda yadda bla',
  // ...
},
// ...
]

基本上只存储上述方法的叶子,以及属于它们的所有信息。

典型的请求是:

  • 提供文档deadbeef
  • 的所有修订版
  • 向我提供文件6的修订caffee

其中一种方法明显更好吗?这两种方法的优点/缺点是什么?

1 个答案:

答案 0 :(得分:1)

您的第二个架构是第一个架构的非规范化版本。比较更多关系方法可能有用:

{
    documents: [
        {
            id: 'deadbeef',
            url: 'https://lol.cat/1234',
            // ...
        },
        // ...
    ],
    revisions: [
        {
            id: '1',
            documentId: 'deadbeef'
            title: 'foo',
            authors: ['lol', 'cat'],
            content: 'yadda yadda',
            // ...
        },
        {
            id: '2',
            documentId: 'deadbeef',
            title: 'foo',
            authors: ['lol', 'cat'],
            content: 'yadda yadda bla',
            // ...
        },
        // ...
    ]
}

嵌套方法遇到了一个称为访问路径依赖的问题。基本上,通过假设一个首选层次结构,它使得需要不同层次结构的查询更加困难。

非规范化版本可能会受到更新异常的影响,这意味着部分更新可能会使数据库处于不一致状态。

另一方面,关系方法并不支持任何层次结构,从而支持临时查询,而规范化有助于消除更新异常。 RDBMS还包含许多完整性检查和约束,以确保数据的有效性。