postgresql 是否有更好的方法来创建模式

jjhzyzn0  于 2023-01-13  发布在  PostgreSQL
关注(0)|答案(1)|浏览(124)

对于这个例子,我有4个模式。PictureVideoGame可以有多个Download。虽然它会对多个表造成混乱,但在从调用方搜索下载时可以正常工作(PictureVideoGame)。但是当我想从Download端确定调用者时,问题出现了。我需要查找3个多对多表,然后提取我的数据。
typeorm中有什么东西可以减轻我的痛苦吗?或者说,这种设计多模式多对多的方式是不正确的吗?你们遇到过类似的问题吗?如果有,你们是如何解决的?
先谢了

@Entity()
export class Picture {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    name: string

    @ManyToMany(() => Download)
    @JoinTable()
    downloads: Download[]
}

@Entity()
export class Video {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    name: string

    @ManyToMany(() => Download)
    @JoinTable()
    downloads: Download[]
}

@Entity()
export class Game {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    name: string

    @ManyToMany(() => Download)
    @JoinTable()
    downloads: Download[]
}

@Entity()
export class Download {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    source: string

    @Column()
    status: string

    @Column()
    path: string
}
8wtpewkr

8wtpewkr1#

假设我们不能假设您正在使用的连接技术,因为模式描述没有为我们提供可以执行连接语句的相关字段(我看到您使用的是source: string,但其他模式使用的是int ID),那么在相关列上引入索引可能会加快SELECT语句的速度。
我正在考虑围绕以下内容的一些东西投入用途:

select *
from downloads d
join game g on g.id = CAST(coalesce(d.source, '0') AS integer)
join video v on v.id = CAST(coalesce(d.source, '0') AS integer)
join picture p on p.id = CAST(coalesce(d.source, '0') AS integer)

现在,假设我们有这样的下载表结构:

CREATE OR REPLACE TABLE Download(
id int,
source_id int,
source varchar,
status varchar,
primary key id);

create index source_id_index on Download(source_id);

如果Downloads表中的source_id和相邻表中的ID都被索引了,那么服务器的工作就会轻松得多;这样select语句的工作速度会更快:

select * from downloads d
join video v on v.id = d.source_id
join picture p on p.id = d.source_id
join game g on g.id = d.source_id

现在,这也可能意味着相邻表的ID不重复,如果它们重复,您也可以引入一些变量,如content_source_id int,并做一个case when.Total沙箱。
Postgres的文档中也有一些关于索引的细节:https://www.postgresql.org/docs/current/sql-createindex.html

相关问题