mysql - 将 sql 数据库模式转换为 IndexedDB

标签 mysql indexeddb

我的 SQL 架构中有三个表:包含地址等的客户表、包含订单详细信息的订单以及存储上传文件的文件。文件表和订单表都包含引用客户端表的外键。

我该如何在 IndexedDB 中做到这一点?我对整个键索引思维很陌生,只是想了解如何使用 indexedDB 完成同样的事情。

现在我知道有一个 shim.js 文件,但我正在尝试理解这个概念本身。

非常感谢帮助和提示!

编辑:

所以我真的必须考虑我想要允许哪些查询,然后优化这些查询的 IndexedDB 实现,这是这里的要点吗?基本上,我想存储一个客户一次,然后为该客户存储许多订单,然后能够为该客户上传小文件(最好是pdf),甚至不一定为每个订单(尽管如果这很容易实现,我可以这样做)它)...我将每个客户视为一个单独的实体,我不会有“给我所有订购 xy 的客户”之类的东西 - 我只需要每个客户一次,然后存储该客户的所有订单和所有文件。我希望能够:搜索名为 XY 的客户 - 然后它会为我提供所有订单及其日期的列表以及为该客户上传的文件列表(可能与订单相关)。

最佳答案

这个问题有点太宽泛,无法正确回答。然而,从 SQL 过渡到 No-SQL (indexedDB) 时要学习的主要概念是对象存储的概念。大多数 SQL 数据库都是关系数据库,并为您执行大部分优化查询的工作。 indexedDB 没有。因此,规范化和非规范化的概念有点不同。重点是明确规划您自己的查询。与应用程序/系统的设计不同,应用程序/系统允许在稍后的时间点设计简单的即席 SQL 查询,甚至可能在以后轻松添加/更改,您确实需要预先进行大量规划对于索引数据库。

因此,不太安全地说,转换只是创建三个对象存储来对应您的三个关系表。其一,indexedDB 中没有加入的概念,因此您无法通过外键加入。

您的问题并不清楚,但您的 3 个表是客户、订单和文件。我将在这里冒险做出一些猜测。我敢打赌你可以使用单个对象存储,客户端。然后,对于每个客户端对象,存储普通客户端属性、存储订单数组属性和存储文件数组属性。在orders数组中,存储订单对象。

如果你的文件是二进制的,这将不起作用,你将需要使用blob,甚至可能会在各种浏览器indexedDB实现中遇到blob支持的问题(Chrome有点支持它,不同版本不清楚) .

这假设您的典型查询计划是您需要执行诸如列出客户订单之类的操作,这是最常用的查询类型。

如果您需要跨订单执行某些操作,而不管订单属于哪个客户,那么这种方法的效果就不太好,您必须遍历整个商店。

如果客户-订单关系是多对多,那么这也不会很好地工作,因为需要为每个客户冗余存储订单信息。然而,这里需要注意的是,这种冗余存储在像 indexedDB 这样的 NoSQL 风格数据库中非常常见。目标不是完美地建模数据,而是以一种能够快速完成最常发生的查询的方式存储数据(同时仍然保持正确性)。

编辑:

根据您的编辑,我建议使用三个对象存储的简单原型(prototype)。在显示客户详细信息的客户 View 页面中,只需运行三个单独的查询即可。

  1. 根据客户端 ID 从客户端对象存储中获取一个实体。
  2. 在订单上打开光标并获取该客户的所有订单。在订单存储中,使用 client-id 属性。在此 client-id 属性上创建索引。将光标打开到特定客户端 ID 的索引上。
  3. 使用与 #2 类似的策略在文件存储上打开光标。

在您的业务逻辑层中,强制执行数据约束。例如,删除客户端时,首先从文件存储中删除所有文件,然后从订单存储中删除所有订单,最后从客户端存储中删除单个客户端实体。

我的建议是不要想太多。事情并没有那么复杂。到目前为止,您还没有描述一些听起来会存在性能问题的东西,因此不需要更优雅的东西。

关于mysql - 将 sql 数据库模式转换为 IndexedDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26339051/

相关文章:

php - 给出警告 : mysqli_select_db() expects exactly 2 parameters, 1 *13*

php - 在 MySQL 中存储 SHA-512 哈希

html - 索引数据库性能

javascript - "An IndexedDB transaction that was not yet complete has been aborted due to page navigation"

javascript - 在升级事件中异步更新 IndexedDB

php - 使用 jQuery 从 JSON/MYSQL 更新表

MySQL条件

php - 使用来自 mysql 的信息从 PHP 打开 fancyBox

javascript - 为什么在连接到 indexedDB 时有时会在 onupgradeneeded 之前调用 onsuccess?

javascript - 在 indexedDb 中添加多个对象的正确方法?