我想在Postgres数据库中存储一些嵌套信息,我想知道这样做的最佳方法是什么。
我有一个出租汽车清单,其结构如下:
[品牌]> [型号]> [该品牌和型号的单车出租],例如:
[
{
"id": 1,
"name": "Audi",
"models": [
{
"id": 1,
"name": "A1",
"cars": [
{
"id": 1,
"license": "RPY9973",
"mileage": "41053"
},
{
"id": 2,
"license": "RPY3001",
"mileage": "102302"
},
{
"id": 3,
"license": "RPY9852",
"mileage": "10236"
}
]
},
{
"id": 2,
"name": "A3",
"cars": [
{
"id": 1,
"license": "RPY1013",
"mileage": "66952"
},
{
"id": 2,
"license": "RPY3284",
"mileage": "215213"
},
{
"id": 3,
"license": "RPY0126",
"mileage": "19632"
}
]
}
...
]
}
...
]
目前,由于我在数据库和存储阵列方面的经验有限,因此将其存储在“ brands”表中,其中包含以下列:
id(整数)-品牌ID
名称(文字)-品牌名称
模型(文字)-包含模型和汽车的字符串化内容,阅读时会对其进行解析
实际上,这可以完成工作,但是我想知道最有效的方法是什么。
例如,我应该将单个表分成三个表:“ brands”,“ models”和“ cars”,并使这些表相互引用(brands.models是一组唯一的模型ID,我可以用来从“模型”表中读取数据,而models.cars是一个唯一的汽车ID数组,我可以用来从“ cars”表中读取数据)?
答案 0 :(得分:1)
存储数据的最有效方式不是将其存储为json
,jsonb
或数组,而是将其存储为关系数据(为简洁起见,不包括数据类型):< / p>
create table brands(
id,
name,
/* other columns */
PRIMARY KEY (id)
);
create table models(
id,
name,
brand_id REFERENCES brands(id),
/* other columns */
PRIMARY KEY (id)
);
create table cars(
id,
model_id REFERENCES models(id),
mileage,
license,
/* other columns */
PRIMARY KEY (id)
);
然后您可以分别获取和更新每个实体,而无需解析json。当您只需要关注单行而不是担心更新数组或json时,部分更新也变得容易得多。对于查询,您可以通过主键进行联接。例如,要获得某个品牌的租车服务:
select b.id, b.name, m.id, m.name, c.id, c.mileage, c.license
FROM brands b
LEFT JOIN models m
ON m.brand_id = b.id
LEFT JOIN cars c
ON c.model_id = m.id
where b.id = ?
基于查询/过滤模式,您还希望在常用列上创建索引...
CREATE INDEX idx_car_model ON cars(model_id);
CREATE INDEX idx_model_brand ON models(brand_id);
答案 1 :(得分:0)
将嵌套数据存储在postgres数据库中的最佳解决方案是json
或jsonb
字段。
使用json
或jsonb
的好处是: