我对关系数据库有经验,其中原子性和规范化是基本原则。
这些原则是否也适用于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世界中,哪些设计最佳?
更新
进一步澄清我的问题:
我想了解/理解这样的内容:以下哪些变体可以更快地搜索,更容易更新,增加点击量,可以更智能地编制索引?
答案 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
值的文档在那里没有值。
但是如果你真的是指原子性,那么大多数文档系统只允许一个文档系统原子地更新单个文档,因此人们希望将值组合在一起组成一个可能同时更改的文档。