【发布时间】:2022-02-15 03:36:27
【问题描述】:
是否可以使用第一个表中的 id 数组连接两个表?
示例
订单表
create table orders
(
id UUID DEFAULT uuid_generate_v4(),
user_id INT REFERENCES users (id),
products_ids JSON NOT NULL,
checkout_date TIMESTAMP DEFAULT NOW()
);
产品表
create table products
(
id SERIAL PRIMARY KEY, -- some other columns
)
一些记录示例
订单表
| id | user_id | products_ids | checkout_date |
|---|---|---|---|
| 0872ffb5-e347-447c-8b28-59368409cb84 | 1 | [1,2] | 1644863659550 |
产品表
| id | title | other columns |
|---|---|---|
| 1 | 'Lorem' | |
| 2 | 'Ipsum' |
我想通过 products_ids 加入这两个表
SELECT *
FROM orders AS o
INNER JOIN products AS p ON p.id = ANY(o.products_ids)
WHERE o.usre_id = 1
ORDER BY o.checkout_date
【问题讨论】:
-
可能吗?当然。高效的?没有;它会像蜗牛一样快。
-
你最好解决真正的问题,你的数据模型。
-
= any(...)只能用于原生数组,不能用于 JSON 值。1644863659550也不是时间戳值 -
对于模型,永远不要将数组存储在列中,而是使用单独的表。它可以是 (order_id, product_id)。
-
@ysth 这是一个未达到 1NF 的非规范化表。为了使查询实现高效,索引需要接受多条目。典型的 B-TREE 索引是行不通的。 PostgreSQL 实现了符合要求的 GIST 和 GIN 索引,但我认为 OP 不想处理实现它们的所有影响。
标签: sql postgresql