是否有 (key:value) 对数据类型可用作 SQL 中的列 - 特别是 Google Cloud Spanner?

Is there a (key:value) pair datatype that can be used as a column in SQL - Specifically Google Cloud Spanner?

考虑到我想在 Google Cloud Spanner 的数据库中的 table 中存储商店的销售情况。 table 将(除了作为主键的销售 ID 之外)必须存储已售产品 ID 列表,以及每种已售产品的数量。理想情况下,这将采用

等列的形式
productsSold ARRAY<product OBJECT <productID INT64, quantity INT64>>

即数组中的每个元素都是一个对象,其中包含产品 ID 以及相应产品的销售数量。我在 Google Cloud Spanner 中看到了 STRUCT 数据类型,这很理想,但您似乎无法使用它创建列。

或者,它可以存储在两个单独的数组中,如

productIDs ARRAY
quantities ARRAY

但这有可能导致数组不同步,因为 productIDs 中的每个元素都没有直接链接到 quantities[= 中的相应元素26=].

根据最佳数据库约定并通过 Google Cloud Spanner 的可能性,您推荐什么是存储此数据的理想方式?提前致谢!

首先,我通常会将其设计为使用两个 interleaved tables,所以像这样:

CREATE TABLE Products (
  ProductId STRING(36) NOT NULL,
  Name STRING(200),
) PRIMARY KEY (ProductId);

CREATE TABLE Sales (
  SaleId STRING(36) NOT NULL,
  CustomerId STRING(36) NOT NULL,
) PRIMARY KEY (SaleId);

CREATE ProductSales (
  SaleId STRING(36) NOT NULL,
  ProductSaleId INT64 NOT NULL,
  ProductId STRING(36) NOT NULL,
  Quantity INT64,
) PRIMARY KEY (SaleId, ProductSaleId), INTERLEAVE IN PARENT (Sales);

如果您出于某种原因 must/want 使用数组将它们存储在单个 table 中,那么您可以使用 CHECK CONSTRAINT 来确保数组具有相同的大小:

CREATE TABLE Sales (
  SaleId STRING(36) NOT NULL,
  ProductIds ARRAY<STRING(36)>,
  Quantities ARRAY<INT64>,
  CONSTRAINT arrays_equal_length CHECK(ARRAY_LENGTH(ProductIds) = ARRAY_LENGTH(Quantities)),
) PRIMARY KEY ProductId;