我使用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", ...},
}
它将按如下方式驻留在数据库中:
-- 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 |
注意,这些桌子很大(数以亿计).通常针对写作进行了优化.
根据多个对象参数查询/过滤对象的好方法是什么?例如: Select 每个唯一用户10
岁以上的所有husky
只狗的数量.
我还想知道,对表进行反规范化并将参数折叠到JSON列(并使用GIN索引)是否会更好.
这里有什么我可以使用的标准吗?