我使用Postgres中的以下两个表保存动态对象(我不知道其类型的对象):
CREATE TABLE IF NOT EXISTS objects(
id UUID NOT NULL DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
name TEXT NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE IF NOT EXISTS object_values(
id UUID NOT NULL DEFAULT gen_random_uuid(),
event_id UUID NOT NULL,
param TEXT NOT NULL,
value TEXT NOT NULL,
);
例如,如果我有以下对象:
dog = [
{ breed: "poodle", age: 15, ...},
{ breed: "husky", age: 9, ...},
}
monitors = [
{ manufacturer: "dell", ...},
}
它将按如下方式保存在DB中:
-- objects
| id | user_id | name |
|----|---------|---------|
| 1 | 1 | dog |
| 2 | 2 | dog |
| 3 | 1 | monitor |
-- object_values
| id | event_id | param | value |
|----|----------|--------------|--------|
| 1 | 1 | breed | poodle |
| 2 | 1 | age | 15 |
| 3 | 2 | breed | husky |
| 4 | 2 | age | 9 |
| 5 | 3 | manufacturer | dell |
注意,这些表很大(数亿个)。通常为编写优化。基于多个对象参数查询/过滤对象的好方法是什么?例如:选择每个唯一用户年龄超过10
的所有husky
犬的数量。
我还想知道,如果对表进行非规范化处理,并将参数折叠到JSON列(并使用gin索引),是否会更好。
有什么标准我可以用吗?
1条答案
按热度按时间lo8azlld1#
"* 选择每个唯一用户拥有的10岁以上的所有哈士奇狗的数量 *"-下面的查询将完成此操作。
由于您的查询最有可能受到这两个表之间对相同字段执行相同
JOIN
操作的影响,因此最好在以下位置使用indices:检查here演示。