2011-09-13 34 views
5

Tất cả các bạn xử lý các mối quan hệ nhiều-nhiều trong IndexedDB như thế nào?Chỉ mụcDB và mối quan hệ nhiều-nhiều

Ví dụ: giả sử tôi có đối tượng Blog để giữ bài đăng trên blog và đối tượng Tag cho thẻ/nhãn của bài đăng trên blog. Một Blog có thể có nhiều Tag s và một Tag có thể được nhiều người sử dụng Blog s.

tôi sẽ tạo ra một blog storetag store (mặc dù tôi mở để gợi ý) đến nhà hai loại đối tượng:

// ... 
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}); 

Tắt tay tôi có thể nghĩ đến hai cách để liên kết hai:

  1. có một Blog.tags đó sẽ là một mảng của BlogTag đối tượng nắm giữ blogIdtagId (và cũng có thể sẽ là trong cửa hàng để thu hồi) hoặc
  2. có một số Blog.tags sẽ là một mảng tagId s có thể được sử dụng để tra cứu số Tag s.

Cách đầu tiên có vẻ dài hơn nhưng đó là cách điều này sẽ được giải quyết trong SQL. Đó có phải là hành lý của SQL mà tôi nên bỏ lại không?

Tôi giả sử cách thứ 3 là có Blog.tags là một mảng Tag s. Điều này có vẻ đơn giản nhưng sau đó tôi không thể truy vấn các thẻ Tag hoặc sử dụng lại trên blog (hoặc tôi có thể?).

Có ai khác đã xử lý tình huống như vậy với indexedDB không? Nếu vậy, bạn đã làm gì? Một số cạm bẫy là gì?

Trả lời

7

Tôi đang làm việc theo số IndexedDB-backed JS neural network implementation và đối mặt với vấn đề này rất .

Chúng tôi không có tham gia trong IndexedDB vì vậy bạn đang xem ít nhất hai lần truy cập cửa hàng đối tượng trừ khi bạn đang thực hiện một số loại ghi nhớ/lưu vào bộ nhớ cache. Từ kinh nghiệm tôi đã tìm thấy rằng một phong cách hướng tài liệu là tốt nhất với các đối tượng IndexedDB (lưu trữ tất cả mọi thứ trong cùng một cửa hàng), nhưng một cửa hàng thứ cấp là cần thiết để quan hệ nhà.

Đây là những gì tôi đang làm.

Giả sử bạn muốn có một cửa hàng địa phương gồm các diễn viên và phim - giống như IMDB. Điều này và hầu hết các mối quan hệ nhiều-nhiều có thể được mô hình hóa với IndexedDB bằng cách sử dụng hai bảng: Các đối tượng và các mối quan hệ.

Dưới đây là hai bảng. Bạn sẽ muốn tra cứu chính * trên hầu hết mọi thứ. Bất cứ điều gì không nói duy nhất có thể là không duy nhất.

Đối tượng phản đối cửa hàng:

type_id* 
whatever*.. 

Mối quan hệ cửa hàng đối tượng:

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

Một ví dụ diễn viên/phim sẽ có hai bản ghi trong bảng Đối tượng và một trong bảng mối quan hệ:

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

Psuedo-code để xem phim của 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-code để nhận tất cả các phim từ một năm nhất định:

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

psuedo-mã cho nhận diễn viên của bộ phim:

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-mã cho nhận được tất cả các diễn viên:

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 
Các vấn đề liên quan