是否有 (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;
考虑到我想在 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;