JSON 建模方法
JSON Modelling Approaches
假设我正在以 JSON 格式存储一个人的 phone 号码。一个这样的 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"
}
}
这两种建模方法的优缺点是什么?我看到的显而易见的是,第一种方法允许一次检索 all phones。
我觉得你的第一个例子更好。
有了你的第一个解决方案phone数字只是一个集合,很容易add/delete/filtersphone数字。
// 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
。另一件事,如果你添加新类型的 phone,你不关心你只需要添加新的 type
值。
为了决定在这种情况下要做什么,您也应该在实施过程中进行思考。
例如,假设您将通过 Python 解析和使用它。如果你把它作为一个列表,你将不得不遍历列表以找到一个给定的数字,在最坏的情况下可能最终成为一个 O(n) 任务。
如果将其重构为字典(散列 table),通过访问右键查找 phone 数字将更接近于 O(1)。
总而言之,您对数据的处理方式以及您将如何使用它应该决定其结构。
假设我正在以 JSON 格式存储一个人的 phone 号码。一个这样的 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"
}
}
这两种建模方法的优缺点是什么?我看到的显而易见的是,第一种方法允许一次检索 all phones。
我觉得你的第一个例子更好。
有了你的第一个解决方案phone数字只是一个集合,很容易add/delete/filtersphone数字。
// 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
。另一件事,如果你添加新类型的 phone,你不关心你只需要添加新的 type
值。
为了决定在这种情况下要做什么,您也应该在实施过程中进行思考。
例如,假设您将通过 Python 解析和使用它。如果你把它作为一个列表,你将不得不遍历列表以找到一个给定的数字,在最坏的情况下可能最终成为一个 O(n) 任务。
如果将其重构为字典(散列 table),通过访问右键查找 phone 数字将更接近于 O(1)。
总而言之,您对数据的处理方式以及您将如何使用它应该决定其结构。