使用存储在 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
我有两个 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