7

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

例如,我有两个对象存储:artistalbum. Anartist与 具有一对多的关系albumalbum.artistId将专辑与artist.id.

我在这里按照 Hibernate 的思路思考。我想对艺术家进行查询,并将属于该艺术家的专辑作为artistsalbum对象上调用的数组返回。

artist.albums = [];

跟进(4.5 年后,2017 年)

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

4

4 回答 4

4

在 IndexedDB 中,关系只是对其他存储的引用。在这种情况下,artiststore 的 id 是 store 中的索引字段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
  })    
});
于 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 - 另一个使用 LINQ 样式查询 IndexedDB 的库 - http://linq2indexeddb.codeplex.com

于 2012-08-10T20:29:55.780 回答
0

我看到了解决这个问题的两种方法。

第一种是采用第三种范式——有一个对象存储来存储数据对象,另一个来存储它们之间的关系。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' ) ) );
于 2011-11-15T01:46:08.813 回答