我想将数据存储在可以嵌套的数据库中,如
[
{
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
。其中一种方法明显更好吗?这两种方法的优点/缺点是什么?
答案 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还包含许多完整性检查和约束,以确保数据的有效性。