NoSQL和原子性/规范化

时间:2011-09-14 09:17:17

标签: database-design nosql

我对关系数据库有经验,其中原子性和规范化是基本原则。

这些原则是否也适用于NoSQL环境?

看看以下用不同语言表示字符串的方式(用MongoDB表示法):

{
    'name': 'label_hello',
    'en'  : 'hello world!',
    'de'  : 'hallo welt!',
    'es'  : 'hola mundo!'
}

{
    'name'  : 'label_hello',
    'values': {
        'en'  : 'hello world!',
        'de'  : 'hallo welt!',
        'es'  : 'hola mundo!'
    }
}

VS。更原子的变体:

{
    'name' : 'label_hello',
    'lang' : 'en',
    'value': 'hello world!'
}
{
    'name' : 'label_hello',
    'lang' : 'de',
    'value': 'hallo welt!'
}
{
    'name' : 'label_hello',
    'lang' : 'es',
    'value': 'hola mundo!'
}

在NoSQL世界中,哪些设计最佳?

更新

进一步澄清我的问题:

我想了解/理解这样的内容:以下哪些变体可以更快地搜索,更容易更新,增加点击量,可以更智能地编制索引?

3 个答案:

答案 0 :(得分:3)

第二种变体可以更快地工作,但第一种变体会占用更少的内存 在第一个变体中,我们对“名称”值的重复次数较少,因此我选择第一个变体,因为我不喜欢重复。

答案 1 :(得分:1)

我是NoSQL的新手,但根据我对像Redis这样的实用程序的经验,我可以建议,为索引最后一个变体是最好的。其次是紧凑型,因此主要是开发人员选择。并非所有时间都在原子性和规范化框架中,有时它应该超越。

答案 2 :(得分:0)

你不是指归一化而不是原子性吗?您在顶部的内容是(name,en,de,es),在底部(name,lang,value)就关系来说,后者允许添加其他语言而不添加列,但在文档形式中添加列是正常的(name,en,de,es)可以毫无问题地扩展到(name,en,de,es,fr),因为没有fr值的文档在那里没有值。

但是如果你真的是指原子性,那么大多数文档系统只允许一个文档系统原子地更新单个文档,因此人们希望将值组合在一起组成一个可能同时更改的文档。