Javascript IndexedDB和关系

Javascript IndexedDB和关系,javascript,indexeddb,Javascript,Indexeddb,我可以在IndexedDB中的对象存储之间创建关系吗 例如,我有两个对象存储:artist和album。艺术家与专辑有一对多的关系唱片集.artistId将唱片集与艺术家.id关联 我在想冬眠。我想查询艺术家,并在album对象上将属于该艺术家的相册作为名为artists的数组返回 artist.albums = []; 随访(4.5年后,2017年) 下面有一些很好的答案可以很好地回答这个问题。我想补充一点,我最初尝试使用IndexedDB作为关系存储,并在其上构建一个类似ORM的解决方案,

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

例如,我有两个对象存储:
artist
album
艺术家
专辑
有一对多的关系<代码>唱片集.artistId将唱片集与
艺术家.id
关联

我在想冬眠。我想查询艺术家,并在
album
对象上将属于该艺术家的相册作为名为
artists
的数组返回

artist.albums = [];
随访(4.5年后,2017年)
下面有一些很好的答案可以很好地回答这个问题。我想补充一点,我最初尝试使用IndexedDB作为关系存储,并在其上构建一个类似ORM的解决方案,但它并不适合。IndexedDB是一个NoSQL数据库,自从我开始用这种方式处理它以来,它变得更有意义,我的项目也更易于管理。我希望这能为那些经常遇到的人的原始问题增加一些价值。

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

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

考虑以下普遍可能性:

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

回答有点晚了,但我希望这有助于润滑齿轮。

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

第一种是go-style——一个对象存储用于存储数据对象,另一个对象存储用于存储它们之间的关系。IndexedDB不支持JOIN的概念,因此您必须以任何方式进行两次数据库访问,使用这种方法,两个存储区可以各自拥有单独的索引(可以说,它们是关键的)

退一步,根据您的需要,您可以使用简单的键/值方法存储整个JS对象。我还没有衡量过任何东西,但我的直觉是,如果不处理中等数量的数据,就不需要处理规范化的复杂性

退一步说,如果您没有真正的索引,那么您可能并不真正需要IndexedDB。如果你只是在找当地的商店,试试看。它与现代浏览器非常兼容,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' ) ) );

您还可以尝试使用LINQ2IndexedDB—另一个对IndexedDB使用LINQ样式查询的库—

在IndexedDB中,关系只是对其他存储的引用。在这种情况下,
artist
商店的id是
album
商店中的索引字段
artistId
。这样,您就可以使用键范围查询快速查询

使用数据库包装器

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

这是否可以在单个查询上运行?比如,
db.get('artist','album').success(函数(结果){//result是(object)artist和(array)artist.albums})否,除非使用父子关系的复合索引。