IndexedDB和关系

时间:2011-07-05 18:00:28

标签: javascript indexeddb

我可以在IndexedDB中的对象库之间创建关系吗?

例如,我有两个对象库:artistalbumartistalbum具有一对多的关系。 album.artistId将相册与artist.id相关联。

我在想这里的Hibernate。我想对艺术家进行查询,并将属于该艺术家的专辑作为artists对象上的album数组返回。

artist.albums = [];

跟进(4。5年后,2017年)

下面有一些很好的答案可以很好地回答这个问题。我想补充一点,我最初试图将IndexedDB用作关系存储,并在其上构建类似ORM的解决方案,但它并不适合。 IndexedDB是一个NoSQL数据库,因为我开始以这种方式处理它,它更有意义,我的项目更容易管理。我希望这为那些不断遇到它的人增加一些原始问题的价值。

4 个答案:

答案 0 :(得分:3)

在IndexedDB中,关系只是对其他商店的引用。在这种情况下,artist商店的ID是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
  })    
});

答案 1 :(得分:2)

indexedDB提供了用于创建,读取,更新和删除(CRUD)对象“记录”的低级方法。但该标准没有定义关系操作的具体方法。目标是保持标准简单,并允许开发人员以他们认为合适的任何方式实现更高级别的功能。但是,通过您的少量开发,您所要求的仍然是可以实现的。

为了解决问题,Parashuram Narasimhan为indexedDB写了一个Jquery实现,它将为你完成这项工作。

Jquery indexedDB Example 1

Jquery indexedDB Example 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
        }
      ;
    }
  ;

答案有点迟,但我希望它有助于润滑齿轮。

答案 2 :(得分:1)

您也可以尝试使用LINQ2IndexedDB - 另一个对IndexedDB使用LINQ样式查询的库 - http://linq2indexeddb.codeplex.com

答案 3 :(得分:0)

我认为有两种方法可以解决这个问题。

第一个是third normal form - 样式 - 有一个对象存储来存储数据对象,另一个存储它们之间的关系。 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' ) ) );