如果我有两个表条目和 entry_metadata ,则entry_metadata作为entry_id和变量引用的条目的描述表。
如果我有这个:
输入
Fragments
entry_metadata
Activity
我得到了这张桌子:
id | name |
-------------
1 | entry1 |
2 | entry2 |
3 | entry3 |
由sql:
id | entry_id | variable | value
1 | 1 | width | 10
2 | 1 | height | 5
3 | 2 | width | 8
4 | 2 | height | 7
5 | ... | .... | ..
上面的查询有效。但是当我从条目元数据中添加更多变量来获取值(entry_metadata表包含大量变量)时。查询变得非常慢。每次加入我都会大大减慢执行速度。有办法解决这个问题吗?
答案 0 :(得分:2)
您也可以使用条件聚合执行此操作:
select id, name,
max(case when variable = 'width' then value end) as width,
max(case when variable = 'height' then value end) as height
from public.entry_metadata em
group by id, name;
添加其他列只是添加更多聚合函数。
答案 1 :(得分:1)
只需使用子选择:
SELECT
e.id,
e.name,
(SELECT em.value FROM public.entry_metadata em WHERE em.entry_id = e.id AND em.variable = 'width') AS width,
(SELECT em.value FROM public.entry_metadata em WHERE em.entry_id = e.id AND em.variable = 'height') AS height
FROM
public.entry e
因此,对于每个新变量,您只需要再添加一个子选择。
答案 2 :(得分:0)
有没有办法解决这个问题?
是的,将entry_metadata
表替换为entry
中的addtional列(可能的解决方案为hstore
或jsonb
),并使用条目元数据的键值存储。
顺便说一下。你的表代表众所周知的有争议的数据库设计模式,称为"实体属性值"。