想象一下,我正在以JSON格式存储一个人的电话号码。一个这样的JSON记录可能如下所示:
{
"firstName": "John",
"lastName": "Smith",
"phoneNumber": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "mobile",
"number": "646 555-4567"
}
]
}
上述的另一种结构是:
{
"firstName": "John",
"lastName": "Smith",
"homePhone": {
"number": "212 555-1234"
},
"mobilePhone": {
"number": "646 555-4567"
}
}
这两种建模方法的优缺点是什么?我看到的显而易见的是,第一种方法允许一次性检索所有手机。
答案 0 :(得分:2)
为了决定在这种情况下该做什么,你也应该在实施中考虑。
让我们举例来说,您将使用Python解析并使用它。如果你把它作为一个列表,你将不得不循环遍历列表,以便找到一个给定的数字,在最坏的情况下,这个数字可能最终成为O(n)任务。
如果您将其重新考虑为字典(哈希表),则通过访问右键来查找电话号码将更接近O(1)。
总之,您对数据的处理方式以及如何使用它应该决定其结构。
答案 1 :(得分:1)
我认为你的第一个例子更好。
使用您的第一个解决方案电话号码只是一个集合,并且可以轻松添加/删除/过滤电话号码。
// ES6
const allMobilePhones = user.phones.filter(phone => phone.type === 'mobile');
// With Lodash/Underscore
var allMobilePhones = _(user.phones).filter(function(phone){
return phone === 'mobile';
});
它对文档更具可读性,您不必说明看属性mobilePhone
,homePhone
,unusedPhone
,workPhone
。另外,如果您添加新类型的手机,则无需关心您只需添加新的type
值。