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

文档的可读性也更高,不用说看属性mobilePhonehomePhoneunusedPhoneworkPhone。另一件事,如果你添加新类型的 phone,你不关心你只需要添加新的 type 值。

如果您要在 API 上暴露您的 JSON,请查看: micro-api or json-api.

为了决定在这种情况下要做什么,您也应该在实施过程中进行思考。

例如,假设您将通过 Python 解析和使用它。如果你把它作为一个列表,你将不得不遍历列表以找到一个给定的数字,在最坏的情况下可能最终成为一个 O(n) 任务。

如果将其重构为字典(散列 table),通过访问右键查找 phone 数字将更接近于 O(1)。

总而言之,您对数据的处理方式以及您将如何使用它应该决定其结构。