在数据库中存储嵌套信息的最佳方法

时间:2020-01-31 22:22:40

标签: database postgresql

我想在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”表中读取数据)?

2 个答案:

答案 0 :(得分:1)

存储数据的最有效方式不是将其存储为jsonjsonb或数组,而是将其存储为关系数据(为简洁起见,不包括数据类型):< / 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数据库中的最佳解决方案是jsonjsonb字段。 使用jsonjsonb的好处是:

  • 处理速度显着提高,支持索引编制(这可能是一个明显的优势)
  • 更简单的模式设计(用jsonb列替换实体属性值(EAV)表,可以查询,建立索引和将其联接,从而将性能提高到1000倍)
相关问题