我正在写关于web应用程序的离线功能的论文。我的任务是通过带有服务器端关系数据库的Web应用程序和客户端与服务器之间的Ajax/JSON流量来显示离线存储的可能性。我的第一个实现在localStorage中使用了一种方法,将每个Ajax响应以请求URL作为键保存为值。该应用程序工作得很好。然而,在下一步中,我想(即论文要求)使用客户端数据库实现更高级的版本。由于服务器维护关系数据库,所以Web SQL数据库将是直观的选择。但是,正如我们所知,该标准已被弃用,我不想使用未来不确定的技术。因此,我想使用IndexedDB来实现客户端数据库逻辑。不幸的是,在阅读了很多网页上的材料后,这些材料大多数都是非常划伤表面(todo-notes应用程序等),但我仍然不知道如何继续。IndexedDB(关系等)的概念问题
我的任务看起来相当简单:在带有IndexedDB的客户端上实现服务器端数据库,以复制曾经从服务器获取的所有数据。的问题,这使得这远不如直接的是:
- 服务器端的数据库关系,IndexedDB的是(或多或少)
- 有同步客户端和服务器 - 没有直观的方式面向对象端数据库
- 有是实现与外键实现,
现在在服务器上的JOIN在IndexedDB的关系没有直观的方式,我心里有一个概念,我真的很害怕开始实施。我想过为服务器数据库中的每个表创建一个对象存储,并手动为不同对象存储中的关系对象进行编程。简而言之,我的应用程序管理一所大学的课程,我有7个对象商店。
我要证明与来自服务器的JSON响应的例子我的想法(/ *这是注释* /):
{ "course": { /* course object */
"id":1,
"lecturer": { "id":"1", /* lecturer object with many attributes */ },
"semester": { "id":"1", /* semester object with many attributes */ },
/* more references and attributes */
}}
的算法存储与IndexedDB的的数据将存储每个对象,该对象适用于适当对象存储中的对象存储,并将这些对象替换为对这些对象的引用。例如,上述课程对象看起来像在对象存储“课程”以下内容:
{ "course": { /* course object */
"id":1,
"lecturer":
{ "reference": { /* reference to the lecturer in the object store 'lecturer' */
"objectstore":"lecturer",
"id":"1" }
},
"semester":
{ "reference": { /* reference to the semester in the object store 'semester' */
"objectstore":"semester",
"id":"1" }
}
/* more references and attributes */
}}
的算法检索与IndexedDB的数据将然后执行以下操作(我有一个递归模式依稀记):
Retrieve the course object with id=1 from the object store 'course'
For each reference object in the retrieved course object, do
Retrieve the object with id=reference.id from the object store reference.objectstore
Replace the reference object with the retrieved object
可以清楚地看到,这个实现将是非常麻烦的,特别是由于索引资料的异步特性。它也会导致许多不同的事务到数据库只是为了检索一个课程对象,并且性能会受到很大的影响(我不知道IndexedDB事务的性能如何)。
我怎么能做到这一点更好,更简单?
我已经看过这些线程代表类似的问题:link1,link2。我没有看到任何更简单的解决方案。此外,我宁愿避免使用IndexedDB包装框架由于几个原因。
我也能想象得出我是完全错误的轨道与IndexedDB的我的问题上。
编辑:
我终于结束了追求我的方式来存储对象本身在IndexedDB的引用。这可能会导致一些性能问题的情况下,大量的数据与许多参考。但是,如果巧妙地使用,大多数情况下可以避免大量的迭代和数据库命中,并且不需要在内存或IndexedDB本身中存储复杂的数据库模式。
一般我必须说,我得到的是我误解与IndexedDB的动态和直主意,因为在某种程度上具结构数据库的印象。但无论如何,我用JavaScript实现了一切,它运行良好,没有任何不一致的机会。
链接到删除已损坏,也不是问题的一部分。 – 2017-09-03 13:34:28