IndexedDB и отношения - PullRequest
       51

IndexedDB и отношения

6 голосов
/ 05 июля 2011

Могу ли я создать отношения между хранилищами моих объектов в IndexedDB?

Например, у меня есть два хранилища объектов: artist и album. artist имеет отношение один ко многим с album. album.artistId относится к альбому с artist.id.

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

artist.albums = [];

Follow Up (через 4,5 года, 2017)

Ниже приведены несколько великолепных ответов, которые очень хорошо отвечают на вопрос. Я хотел бы добавить, что изначально я пытался использовать IndexedDB в качестве реляционного хранилища и построить поверх него ORM-подобное решение, для которого оно не подходит. IndexedDB - это база данных NoSQL, и с тех пор, как я начал относиться к ней таким образом, она стала более понятной, а моими проектами стало легче управлять. Я надеюсь, что это добавляет ценность оригинальному вопросу для тех, кто постоянно сталкивается с ним.

Ответы [ 4 ]

3 голосов
/ 04 сентября 2012

В IndexedDB отношения - это просто ссылка на другое хранилище.В этом случае artist идентификатор магазина является индексированным полем, artistId, в album хранилище.Таким образом, вы можете быстро выполнить запрос, используя запрос диапазона ключей.

Использование ydn.db.Storage обертка базы данных,

var schema = [stores: [
  {name: 'artist'},
  {name: 'album', 
    indexes: [
      {name: 'artistId'}
    ]
  }
];  
db = new ydn.db.Storage('dbname', schema)

предположим, мы заинтересованы в помощи художника.

db.get('artist', aid).success(function(artist ) {     
  db.query('album', 'artistId').only(aid).success(function(albums) {
    // display artist and albums
  })    
});
2 голосов
/ 23 июля 2011

IndexedDB предоставляет низкоуровневые методы для создания, чтения, обновления и удаления (CRUD) «записей» объектов. Но стандарт не определяет конкретные методы для реляционных операций. Цель состояла в том, чтобы сделать стандарт простым и позволить разработчикам реализовывать функции более высокого уровня любым удобным для них способом. Однако то, что вы просите, все еще достижимо с помощью небольшого количества разработки с вашей стороны.

Чтобы выручить, Парашурам Нарасимхан написал реализацию Jquery для indexedDB, которая завершит работу за вас.

Jquery indexedDB Пример 1

Jquery indexedDB Пример 2

Рассмотрим следующую обобщенную возможность:

$.indexeddb("MyDatabase")
  .objectStore("Artist")
  .openCursor()
  .each(function(){
    //Got Artist
    //Enumerate for Albums
    $.indexeddb("MyDatabase")
      .objectStore("Artist")
      .openCursor()
      .each(function(){
        //Check for matching artist.Id
        //if this albums's artist matches artist
        //then do something
        }
      ;
    }
  ;

Немного опоздал на ответ, но я надеюсь, что это поможет немного смазать шестерни.

1 голос
/ 11 августа 2012

Вы также можете попробовать использовать LINQ2IndexedDB - другую библиотеку, которая использует запросы в стиле LINQ для IndexedDB - http://linq2indexeddb.codeplex.com

0 голосов
/ 15 ноября 2011

Я вижу два пути решения этой проблемы.

Первый будет идти третий нормальный вид -стиль - иметь одно хранилище объектов для хранения объектов данных, а другое для храненияотношения между ними.IndexedDB не поддерживает концепцию JOIN, поэтому вам все равно придется выполнить два обращения к базе данных, и при таком подходе каждое из двух хранилищ может иметь отдельные индексы (которые, так сказать, являются ключевыми).

Немного отступив, в зависимости от ваших потребностей, вы можете просто сохранить весь объект JS, используя простой подход ключ / значение.Я ничего не измерял, но мой инстинкт пока таков: если вы не имеете дело со средними объемами данных, вам не нужно разбираться со сложностями нормализации.

Отступив еще дальше, есливы на самом деле не индексируете, чем вам может не понадобиться IndexedDB.Если вы просто ищете местный магазин, попробуйте localStorage.Он очень совместим с современными браузерами, а API намного проще.

var obj = { data_object_1: { 'incoming': [ 1, 2, 3 ], 'outgoing': [ 5, 6, 7 ] } };
localStorage.setItem( 'foobar', JSON.stringify( obj ) );
console.log( JSON.parse( getItem( 'foobar' ) ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...