2015-08-20 2 views
4

Представьте, что я храню телефонные номера человека в формате JSON. Одним из таких 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

Третий подход, который сочетает первый и второй примеры, приведенные выше: '{...," phoneNumber ": {" home ":" ... "," mobile ":" ... "}}' Это позволяет вам получить все номера телефонов одновременно и для доступа к каждому имени по нотации пути (например, 'phoneNumber.home') вместо того, чтобы выполнять итерацию по массиву, анализируя значения типа. Хотя у массива есть преимущества для хранения больших коллекций, где требуется легкая итерация для фильтрации. Я думаю, что это сводится к балансу потребностей и предпочтений. – gfullam

+0

Отлично, спасибо @gfullam. У меня будет только фиксированное количество «типов», поэтому ваш подход будет работать нормально. – Steve

ответ

2

Чтобы решить, что делать в этом случае, вы должны подумать и о своей реализации.

Скажем, например, что вы будете разбираться и использовать это с помощью Python. Если вы поместите его в список, вам придется перебирать список, чтобы найти заданное число, которое в худшем случае может закончиться как задача O (n).

Если вы перефакторируете его как словарь (хеш-таблицу), поиск номера телефона путем доступа к правой клавише будет ближе к O (1).

Таким образом, то, что вы делаете с вашими данными и как вы собираетесь использовать, должно диктовать его структуру.

+0

Хорошая мысль, ваше напоминание о моей реализации, спасибо @ zom-pro. – Steve

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. Другое дело, если вы добавляете новый тип телефона, вам все равно, что вам просто нужно добавить новое значение .

Если вы работаете над предоставлением JSON по API, посмотрите: micro-api или json-api.

+0

Спасибо за ваш ответ. Я не понимаю вашу строку кода, где вы определяете константу allMobilePhones, в частности бит '(phone => phone.type === 'mobile')'. – Steve

+0

Жаль Это [ES6] (https://github.com/lukehoban/es6features). Вы можете сделать что-то вроде underscore/lodash: '_.filter (data.phones), function (phone) {return phone.type === 'mobile; }) ' –

Смежные вопросы