使用存储在 JSON 数据类型中的外键连接两个表

Joining two tables with foreign keys stored in JSON data type

我有两个 table 我想加入,用于加入“颜色”的外键 table 存储在 JSON (在数组中),是这有可能吗?还是我必须尝试用循环在 JavaScript 中找出答案?

仅供参考:我正在使用 mysql2 和 express 和 nodejs。

Table 1, 产品:

(
product_id INT
product_name VARCHAR
product_colors JSON
product_price FLOAT
)

Table 2、颜色:

(
color_id: INT
color_name VARCHAR
color_description VARCHAR
)

当前示例'SELECT * FROM products':

[{
product_id: 1,
product_name: 'name of product',
product_colors: [2, 42, 12, 9],
product_price: 12.95
}]

所需输出示例:

[{
product_id: 1,
product_name: 'name of product',
product_colors: [{color_id: 2, color_name: 'Velvet', color_description: 'A reddish-purple color'}, {color_id: 7, color_name: 'Navy', color_description: 'A darker shade of blue similar to the ocean.'}],
product_price: 12.95
}]

您不应存储外键数组。这不是有效的关系数据设计。

您数据库中产品和颜色之间的关系是 many-to-many,任何此类关系最好存储在第三个 table:

CREATE TABLE ProductColors (
  product_id INT,
  color_id INT,
  PRIMARY KEY (product_id, color_id),
  FOREIGN KEY (product_id) REFERENCES Products(product_id),
  FOREIGN KEY (color_id) REFERENCES Colors(color_id)
);

每个 product/color 对都存储在第三个 table 中的单独行中。

然后你可以写一个查询return你想要的格式的结果:

SELECT p.product_id,
 p.product_name,
 JSON_ARRAYAGG(JSON_OBJECT(
  "color_id": c.color_id,
  "color_name": c.color_name,
  "color_description": c.color_description
 )) AS product_colors,
 p.product_price
FROM Products AS p
JOIN ProductColors USING (product_id)
JOIN Colors AS c USING (color_id)
GROUP BY p.product_id;

以标准化格式存储数据。您可以使用 JSON functions.

生成 JSON 结果

P.S.: 货币不要使用FLOAT数据类型,使用NUMERIC(9,2)。阅读 https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html