2013-12-12 3 views
5

В настоящее время я создаю довольно сложное приложение AngularJS, которое хранит данные в базе данных sqlite. Мои данные приложения содержат ссылки на объекты, которые используются во всем приложении. Angular способен отображать эти данные, сравнивать их, и до сих пор все было в порядке.Сохранение ссылок на объекты в JSON

Что я имею в виду под этим? Проверьте этот пример для «шаблона» объектов в моем приложении.

var Person = { 
    name:'some person', 
    owns:[] 
} 

var Cat = { 
    name:'some cat' 
} 

var project = { 
    name:'some project', 
    people:[], 
    cats:[] 
} 

Мое приложение позволит пользователям создавать и управлять этими объектами и создавать отношения между ними. Могут быть созданы экземпляры Person, и каждый объект Person может хранить ссылки на экземпляры Cat.

Как вы, возможно, уже догадались, мой project в конце концов будет выглядеть так, как только пользователь будет манипулировать им.

var project = { 
    name:'some project', 
    people:[person, person, person], 
    cats:[cat, cat cat, cat, cat, cat] 
} 

console.log(project.people[0].owns) 
//logs something like "cat, cat, cat". These are references. 

Мое приложение затем открывается вид на установленный для просмотра каждого person и перечислить на owns свойство, которое содержит экземпляры Cat.

Все хорошо в денди, пока я не понял, что могут быть сложности, хранящие это как JSON в базе данных. JSON.Stringify() и angular.toJSON() не рассматривают ссылки как ссылки, вместо этого они читают их как отдельные объекты.

Я надеюсь получить некоторые сведения о наилучшем способе сохранения этих отношений/ссылок.

Вот два варианта, которые, я считаю, у меня есть.

Вариант 1: Отмените идею сохранения этого в JSON и используйте реляционную базу данных для хранения всего. Это не идеально, потому что он начинает утихать при гибком характере рендеринга объектов в AngularJS. Кроме того, эти данные будут храниться в нескольких местах (онлайн & локально), что может привести к различиям в схеме базы данных, которая будет отлаживать кошмар.

Вариант 2: Магазин уникальный идентификатор с каждым экземпляром Person и Cat. Затем я могу использовать этот идентификатор при рендеринге и создании ассоциаций. Это будет работать, если я создаю пользовательские фильтры в Angular, но глобально удаляя ссылки, когда объекты будут удалены, может стать кошмаром.

+0

Я действительно не знаю, как эти JSON DB хранят свои данные, но разве у вас уже нет бесконечной проблемы с регрессом, когда вы пытаетесь сериализовать «Фред владеет Дино» наряду с «Дино принадлежит Фреде»? Таким образом, это даже не вопрос поиска, но, похоже, нет четкого способа их хранения, если БД уже не создает ссылки для вас ... Или я пропустил что-то фундаментальное? –

+0

Вы правы Скотта, я отредактировал свой вопрос, чтобы отразить вашу озабоченность. В моем приложении (и в приведенном выше примере) это односторонние отношения. «owned_by» не понадобился, и я сначала пропустил это. – lostPixels

+0

С этим я считаю, что некоторые из механизмов хранения JSON, таких как Mongo и Couch, будут хранить достаточное количество метаданных для восстановления этих отношений при поиске объекта 'project'. Но я не знаю о sqllite. То, что они не будут извлекать, - это любые функции конструктора, которые вы могли бы использовать для создания этих объектов. Если вы используете только простые объекты JS, это вообще не повредит. –

ответ

4

Традиционные базы данных на основе баз данных решили эту проблему. Каждая запись/документ, на которые можно ссылаться в нескольких контекстах, хранится в ее собственной таблице/коллекции с помощью id. То, что id ссылается на другие объекты в своих собственных коллекциях.

JSON сам будет хранить только сырые данные, так как вы заметите, ссылки на объекты, которые меняются, не являются чем-то, что может обрабатывать JSON.

Итак, возникает вопрос, являются ли данные отношениями между объектами первого порядка? Или он вложен/внедрен в другой объект?

В вашем примере у проекта много людей, в проекте много кошек, и у людей много проектов.Поэтому, поскольку людям и проектам необходимо ссылаться несколькими другими объектами, каждый ресурс должен быть его собственным ресурсом, ссылка внешним ключом.

// projects.json 
[ 
    { 
    id: 4 
    name: 'homework', 
    person_ids: [1,2,3], 
    } 
] 

// people.json 
[ 
    { 
    id: 1, 
    name: 'Bob', 
    project_ids: [4,5,6], 
    } 
] 

Хорошим примером для внедрения могут быть комментарии к проекту. В этом случае вы всегда получаете доступ к комментариям через проекты. И поскольку комментарий может принадлежать только одному проекту, вложение его имеет больше смысла.

// projects.json 
[ 
    { 
    id: 4 
    name: 'homework', 
    person_ids: [1,2,3], 
    comments: [ 
     { 
     person_id: 1, 
     message: 'My dog ate it' 
     ] 
    ] 
    } 
] 

Я рекомендовал бы читать на том, как Mongoid handles relations. Это рубиновая оболочка для MongoDB, но документы объясняют, как она структурирует коллекции для обеспечения отношений. Возможно, вам будет полезно узнать, как это будет работать.

+0

Привет, Алекс, это отличный ответ и дает информацию, которую я искал. Я собираюсь оставить эту тему открытой дольше, потому что я чувствую, что это хороший разговор с размышлениями, который может привлечь больше ответов. – lostPixels

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