我的SQL Schema中有三个表:具有地址等的客户端,订单详细信息和存储上传文件的文件。 files表和orders表都包含引用Client表的外键。
我如何在IndexedDB中执行此操作?我对这整个关键索引思考不熟悉,并且只想了解,如何使用indexedDB完成同样的事情。
现在我知道有一个shim.js文件,但我试图理解这个概念本身。
高度赞赏的帮助和提示!
编辑:
所以我真的要考虑我想要允许哪些查询,然后针对这些查询优化我的IndexedDB实现,这是主要的一点吗?基本上,我想为客户存储一次然后许多订单,然后能够为该客户上传小文件(最好是pdf),甚至不必为每个订单上传(尽管如果这很容易实现,我可能会这样做它... ...我认为每个客户都是一个单独的实体,我不会有“给我所有订购xy的客户”这样的东西 - 我只需要让每个客户一次,然后存储客户和所有文件的所有订单。我想能够去:搜索名称为XY的客户 - 然后给我一份所有订单及其日期的列表以及为该客户上传的文件列表(可能与订单相关联)。
答案 0 :(得分:2)
这个问题有点过于宽泛而无法正确回答。然而,从SQL转换到No-SQL(indexedDB)时要学习的主要概念是对象存储的概念。大多数SQL数据库都是关系型的,并且为您优化查询执行大部分工作。 indexedDB没有。因此,归一化和非规范化的概念有点不同。重点是明确规划自己的查询。与应用程序/系统的设计不同,该应用程序/系统允许稍后设计的简单临时SQL查询,甚至可能在以后轻松添加/更改,您确实需要在前面进行大量的规划对于indexedDB。
因此,说过渡只是创建三个对象存储以对应三个关系表是不安全的。首先,没有加入indexedDB的概念,因此您无法加入外键。
您的问题并不清楚,但您的3个表格是客户,订单和文件。我会在这里走出去做一些猜测。我敢打赌你可以使用一个对象商店,客户端。然后,对于每个客户端对象,存储正常的客户端属性,存储orders数组属性,并存储文件数组属性。在orders数组中,存储订单对象。
如果您的文件是二进制的,这将无法使用,您将需要使用blob,甚至可能在各种浏览器indexedDB实现中遇到blob支持问题(Chrome类型支持它,从版本到版本不清楚)
这假设您的典型查询计划是您需要执行诸如列出客户端订单之类的操作,这是最常用的查询类型。
如果您需要跨订单执行某些操作,而不管订单属于哪个客户,这将无法正常运行,您将不得不遍历整个商店。
如果客户 - 订单关系是多对多,那么这也不会很好,因为需要为每个客户端冗余地存储订单信息。但是,这里需要注意的是,这种冗余存储在NoSQL风格的数据库(例如indexedDB)中很常见。目标不是完美地建模数据,而是以最快速完成查询的方式存储数据(同时仍保持正确性)。
编辑:
根据你的编辑,我会建议一个使用三个对象存储的简单原型。在显示客户端详细信息的客户端视图页面中,只需运行三个单独的查询。
在bizlogic图层中,强制执行数据约束。例如,删除客户端时,首先从文件存储中删除所有文件,然后从订单存储中删除所有订单,然后从客户端存储中删除单个客户端实体。
我的建议是不要过度思考它。它并不复杂。到目前为止,你没有描述一些听起来会有性能问题的东西,所以不需要更优雅的东西。
答案 1 :(得分:0)
我将接受Josh的回答,但是如果您仍然发现很难使用indexeddb并想继续使用sql。您可以使用sqlweb-它将允许您通过使用sql查询在indexeddb内部进行操作。
例如-
var connection = new JsStore.Instance('jsstore worker path');
connection.runSql("select * from Customers").then(function(result) {
console.log(result);
});