2011-09-13 11 views
5

W jaki sposób radzisz sobie z relacjami wiele do wielu w IndexedDB?Dowiązania IndexedDB i wiele-do-wielu

Na przykład powiedzmy, że mam obiekt Blog do przechowywania posta na blogu i obiektu Tag dla tagu/etykiety posta na blogu. Jeden Blog może mieć wiele Tag s i jeden Tag może być używany przez wiele Blog s.

Chciałbym stworzyć blog store i tag store (choć jestem otwarty na sugestie) do domu dwa rodzaje obiektów:

// ... 
var blogStore = db.createObjectStore("blog", {keyPath: "blogId", autoIncrement: true}); 
blogStore.createIndex("title", "title", {unique: true}); 
var tagStore = db.createObjectStore("tag", {keyPath: "tagId", autoIncrement: true}); 
tagStore.createIndex("label", "label", {unique: true}); 

Off strony mogę myśleć dwa sposoby, aby połączyć dwa:

  1. mają Blog.tags który byłby tablicą BlogTag przedmiotów posiadanych blogId i tagId (i będzie się również w magazynie dla pamięci) lub
  2. mają Blog.tags który byłby tablicą tagId S, które mogą być stosowane, by wyszukać Tag s.

Pierwszy sposób wydaje się dłuższy z wiatrem, ale w jaki sposób zostanie rozwiązany w SQL. Czy to tylko bagaż SQL, który powinienem zostawić?

Przypuszczam, że trzecią drogą byłoby, aby Blog.tags był tablicą Tag s. Wydaje się to najprostsze, ale potem nie mogłem zapytać o s. Tag lub ponownie używać tagów na blogach (czy też ja?).

Czy ktoś inny radził sobie z taką sytuacją z indexedDB? Jeśli tak, to co robiłeś? Jakie były pułapki?

Odpowiedz

7

Pracuję nad IndexedDB-backed JS neural network implementation i napotykałem na ten problem.

Nie mamy dołącza IndexedDB tak patrzysz na co najmniej dwóch magazynie obiektów uderza chyba robisz jakąś memoization/buforowania.

Z doświadczenia Znalazłem że dokument styl zorientowany jest najlepszy z obiektami IndexedDB (sklep wszystko w tym samym sklepie), ale sklep wtórny jest potrzebne do stosunków domowych.

Oto, co robię.

Załóżmy, że chcesz mieć lokalny sklep z aktorami i filmami - coś takiego jak IMDB. Ta i większość dowolnych relacji wiele do wielu może być modelowana za pomocą IndexedDB za pomocą dwóch tabel: Objects and Relationships.

Oto dwie tabele. Chcesz prawie wszystkich kluczowych wyszukiwań *. Wszystko, co nie mówi inaczej, może być nieunikalne.

Przedmioty sprzeciw sklep:

type_id* 
whatever*.. 

Relacje obiekt sklep:

id* (unique, auto-incrementing) 
from_type* 
to_id* 

Przykładem aktor/film byłby dwa rekordy w tabeli obiektów i jeden w tabeli zależność:

var actor1 = { 
    id: 'actor_jonah_goldberg', 
    display: 'Jonah Goldberg', 
}; 

var actor2 = { 
    id: 'actor_michael_cera', 
    display: 'Michael Cera' 
}; 

var movie1 = { 
    id: 'movie_superbad', 
    display: 'Superbad', 
    year: 2007 
}; 

var movie2 = { 
    id: 'movie_juno', 
    display: 'Juno', 
    year: 2007 
}; 

//relationship primary key ids are auto-inc 

var relationship1 = { 
    from_id: 'actor_jonah_goldberg', 
    to_id: 'movie_superbad' 
} 

var relationship2 = { 
    from_id: 'actor_michael_cera', 
    to_id: 'movie_superbad' 
} 

var relationship3 = { 
    from_id: 'actor_michael_cera', 
    to_id: 'movie_juno' 
} 

Kod Psuedo do pobierania filmów Michaela Cery:

IndexedDBApp({ 'store': 'relationships', 'index': 'from_id', 'key': 'actor_michael_cera', 'on_success': function(row) {...}); 
// Would return movie_superbad and movie_juno rows on_success 

Psuedo kodu dla uzyskania wszystkich filmów z danego roku:

IndexedDBApp({ 'store': 'objects', 'index': 'year', 'key': 2007, 'on_success': function(row) {...}); 
// Would return movie_superbad and movie_juno rows on_success 

Psuedo kodu dla uzyskania aktorów filmu to:

IndexedDBApp({ 'store': 'relationships', 'index': 'to_id', 'key': 'movie_superbad', 'on_success': function(row) {...}); 
// Would return actor_jonah_goldberg and actor_michael_cera on_success 

Psuedo-kodu dla uzyskania wszystkich aktorów:

IndexedDBApp({ 'store': 'relationships', 'index': 'id', 'cursor_begin': 'actor_a', 'cursor_end': 'actor_z', 'on_success': function(row) {...}); 
// Would return actor_jonah_goldberg and actor_michael_cera on_success 
Powiązane problemy