JSON建模方法

时间:2015-08-20 12:55:30

标签: json modeling

想象一下,我正在以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"
  }
}

这两种建模方法的优缺点是什么?我看到的显而易见的是,第一种方法允许一次性检索所有手机。

2 个答案:

答案 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';
});

它对文档更具可读性,您不必说明看属性mobilePhonehomePhoneunusedPhoneworkPhone。另外,如果您添加新类型的手机,则无需关心您只需添加新的type值。

如果您正在通过API公开JSON,请查看: micro-apijson-api