2011-09-13 19 views
5

¿Cómo están manejando relaciones muchos a muchos en IndexedDB?IndexedDB y muchas a muchas relaciones

Por ejemplo, supongamos que tengo un objeto Blog para mantener una publicación de blog y un objeto Tag para una etiqueta/etiqueta de la publicación de blog. Uno Blog puede tener muchos Tag sy uno Tag puede ser usado por muchos Blog s.

me gustaría crear un blog store y tag store (aunque estoy abierto a sugerencias) para albergar a los dos tipos de objetos:

// ... 
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 mano que se me ocurren dos maneras de enlazar los dos:

  1. tienen una Blog.tags que sería una matriz de BlogTag objetos que sostiene blogId y tagId (y también sería en la tienda para la recuperación) o
  2. tiene un Blog.tags que sería una matriz de tagId s que podría utilizarse para buscar Tag s.

La primera forma parece más arriesgada, pero es cómo se abordaría en SQL. ¿Eso es solo un bagaje de SQL que debería dejar atrás?

Supongo que una tercera forma sería tener Blog.tags ser una matriz de Tag s. Esto parece más simple, pero luego no pude consultar Tag o reutilizar las etiquetas en los blogs (¿o podría?).

¿Alguien más ha manejado tal situación con indexedDB? Si es así, ¿qué terminaste haciendo? ¿Cuáles fueron algunos escollos?

Respuesta

7

Estoy trabajando en un IndexedDB-backed JS neural network implementation y me enfrenté a este problema de .

No contamos con uniones en IndexedDB por lo que está viendo al menos dos visitas a la tienda de objetos a menos que esté haciendo algún tipo de memoria/almacenamiento en caché.

Por experiencia, he encontrado que un estilo orientado a documentos es mejor con objetos IndexedDB (almacenar todo en la misma tienda), pero se necesita una tienda secundaria para mantener relaciones.

Esto es lo que estoy haciendo.

Supongamos que quiere tener una tienda local de actores y películas, algo así como IMDB. Esta y la mayoría de las relaciones de muchos a muchos se pueden modelar con IndexedDB utilizando dos tablas: Objetos y relaciones.

Aquí están las dos tablas. Querrías búsquedas clave * en casi todo. Todo lo que no dice único puede ser no único.

objetos objeto de almacén:

type_id* 
whatever*.. 

Relaciones objeto de almacén:

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

Un ejemplo agente/película sería dos registros en la tabla objetos y uno en la tabla de relación:

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

Código de Psuedo para obtener las películas de Michael Cera:

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-código para conseguir todas las películas de un año determinado:

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

Psuedo-código para conseguir actores de una película:

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-código para conseguir todos los actores:

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 
Cuestiones relacionadas