gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:24:07 24 4
gpt4 key购买 nike

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

我将如何在 IndexedDB 中做到这一点?我是整个键索引思想的新手,只是想了解如何使用 indexedDB 完成同样的事情。

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

非常感谢帮助和提示!

编辑:

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

最佳答案

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

所以说转换只是创建三个对象存储以对应您的三个关系表的问题并不十分安全。其一,在 indexedDB 中没有加入的概念,所以你不能在外键上加入。

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

如果你的文件是二进制的,这将不起作用,你将需要使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com