7

IndexedDB でオブジェクト ストア間の関係を作成できますか?

たとえば、 と の 2 つのオブジェクト ストアがartistありalbumます。は と 1対多artistの関係にありalbumます。album.artistIdはアルバムを に関連付けartist.idます。

ここでHibernateの方針に沿って考えています。アーティストのクエリを実行し、そのアーティストに属するアルバムをオブジェクトで呼び出される配列として返すようにしたいと考えていartistsますalbum

artist.albums = [];

経過観察(4.5年後、2017年)

以下に、質問に非常によく答えるいくつかの優れた回答があります。私はもともと IndexedDB をリレーショナル ストアとして使用し、その上に ORM のようなソリューションを構築しようとしていたことを付け加えたいと思いますが、これには適していません。IndexedDB は NoSQL データベースです。私は NoSQL データベースをそのように扱い始めて以来、より理にかなっていて、プロジェクトの管理が容易になりました。これが、元の質問に継続的に遭遇する人にとって、元の質問に何らかの価値を追加することを願っています.

4

4 に答える 4

4

IndexedDBでは、関係は他のストアへの参照にすぎません。この場合、ストアのIDは、artistストア内のインデックス付きフィールド、です。このようにして、キー範囲クエリを使用してすばやくクエリを実行できます。artistIdalbum

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
  })    
});
于 2012-09-04T07:32:54.243 に答える
2

indexedDB は、オブジェクトの「レコード」を作成、読み取り、更新、および削除 (CRUD) する低レベルのメソッドを提供します。ただし、標準では、リレーショナル操作の特定のメソッドは定義されていません。目標は、標準をシンプルに保ち、開発者が適切と思われる方法で高レベルの機能を実装できるようにすることでした。ただし、あなたが求めていることは、あなたの側で少量の開発を行うことで達成できます.

この問題を解決するために、Parashuram Narasimhan が indexedDB の Jquery 実装を作成しました。これで作業は完了です。

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

回答には少し遅れましたが、ギアに少しグリースを塗るのに役立つことを願っています.

于 2011-07-23T00:14:52.080 に答える
1

また、LINQ2IndexedDB (IndexedDB に LINQ スタイルのクエリを使用する別のライブラリ) を使用することもできます - http://linq2indexeddb.codeplex.com

于 2012-08-10T20:29:55.780 に答える
0

この問題にアプローチする方法は 2 つあります。

1 つ目は、第 3 の正規形スタイルに進むことです。つまり、データ オブジェクトを格納するオブジェクト ストアと、オブジェクト間の関係を格納する別のオブジェクト ストアを用意します。IndexedDB は JOIN の概念をサポートしていないため、とにかく 2 つのデータベース ヒットを行う必要があります。そのアプローチでは、2 つのストアがそれぞれ個別のインデックスを持つことができます (いわばこれが重要です)。

少し戻って、必要に応じて、単純なキー/値アプローチを使用して 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' ) ) );
于 2011-11-15T01:46:08.813 に答える