IndexedDB 中的概念性问题(包括关系等)

前言

IndexedDB 是 Web 端的一种本地数据库,与其他浏览器存储方案相比,其具有更高的容量限制和更强大的查询能力。尽管 IndexedDB 提供了许多便利,但在实践中仍存在许多概念性问题,特别是涉及到数据之间的关系时。

本文将探讨 IndexedDB 中的关系问题,并提供深度的学习和指导意义,同时也会包含示例代码。

关系模型

关系是现代应用程序中最常见的数据结构之一。它们使我们能够方便地组织和操作数据,从而实现更好的可扩展性和可维护性。但是,IndexedDB 并没有直接支持关系模型。相反,它使用对象存储(Object Stores)来存储数据。这意味着,如果要表示对象之间的关系,则需要自己设计并实现该关系。

以下是一个简单的示例:

----- ------------ - -
  - ---- -------------- ----- ------- ---- --- ------ ------------------ --
  - ---- -------------- ----- -------- ---- --- ------ ---------------- -
--

----- --------- - -
  - -------- -- ----------- -------------- ----- ------------ --
  - -------- -- ----------- -------------- ----- ------------ --
  - -------- -- ----------- -------------- ----- ------------ -
--

----- ------------- - --------------------------------- - -------- ----- ---
--------------------------------------- -
  ----------------------------
---

----- ---------- - ------------------------------ - ------------- - ---- ---
--------------------------------- -
  ----------------------
---

在这个示例中,我们有两个对象存储:一个用于存储客户数据,另一个用于存储订单数据。每个客户都有一个 SSN(社会安全号码)属性,用作关键字。每个订单都有一个自动生成的 orderId 属性。为了表示客户和订单之间的关系,每个订单都包含一个 customerId 属性,该属性对应于客户的 SSN。

要检索具有特定客户 ID 的所有订单,需要进行以下查询:

----- ----- - -------------------------------------------------------------------
----- ----- - --------------------------------

--------------------------------- - --------------- -
  ----- ------ - --------------------
  -- -------- -
    --------------------------
    ------------------
  -
--

在此示例中,我们使用 customers 对象存储中的每个客户的 SSN 作为 orders 存储中 customerId 属性的值。我们通过使用 index 方法来检索所有具有特定客户 ID 的订单,并使用 cursor 对象逐个处理每个匹配的订单。

数据完整性

另一个需要注意的问题是 IndexedDB 不会强制实施数据完整性。这意味着,如果您正在编写的应用程序需要确保数据的完整性,那么您需要自己实现该功能。以下是一些建议:

  • 在开启事务前检查所需的数据是否存在
  • 如果插入或更新失败,请撤销事务
  • 在对象存储之间使用键或其他属性建立关系

以下示例展示了如何使用键建立关系:

----- ------------ - -
  - --- -- ----- ------- ---- --- ------ ------------------ --
  - --- -- ----- -------- ---- --

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------