TypeORM+NestJS一对一关系在PostgreSQL ERD中显示为一对多问题
问题
使用TypeORM结合NestJS构建两张表的一对一关系,但在pgAdmin的ERD图中却显示为多对一/一对多关系,配置是否存在遗漏?
代码片段
@Entity({ name: 'users' }) @ObjectType() export class User { @PrimaryGeneratedColumn() @Field((type) => Int) id: number @Column() @Field() username: string @Column({ nullable: true }) @Field({ nullable: true }) displayName?: string @OneToOne(() => UserSetting) @JoinColumn() @Field({ nullable: true }) settings?: UserSetting } @Entity({ name: 'user_settings' }) @ObjectType() export class UserSetting { @PrimaryColumn() @Field((type) => Int) userId: number @Column({ default: false }) @Field({ defaultValue: false }) receiveNotifications: boolean @Column({ default: false }) @Field({ defaultValue: false }) receiveEmails: boolean }
ERD截图

解决方案
问题出在UserSetting实体的配置不完整:当前仅定义了主键userId,但未建立反向的一对一关联,数据库层面也没有明确约束该字段的唯一性逻辑,导致pgAdmin将其识别为多对一关系。
修改步骤:
- 在
UserSetting中添加反向的@OneToOne关联,指定关联到User的settings字段 - 明确将
userId作为外键关联到users表的主键
修改后的UserSetting代码:
@Entity({ name: 'user_settings' }) @ObjectType() export class UserSetting { @PrimaryColumn() @Field((type) => Int) userId: number // 补全反向一对一关联,绑定User实体的settings字段 @OneToOne(() => User, user => user.settings) @JoinColumn({ name: 'userId' }) // 明确指定外键列对应userId user: User @Column({ default: false }) @Field({ defaultValue: false }) receiveNotifications: boolean @Column({ default: false }) @Field({ defaultValue: false }) receiveEmails: boolean }
补全反向关联后,TypeORM会生成标准的一对一外键约束,pgAdmin的ERD图就能正确识别为一对一关系。
内容的提问来源于stack exchange,提问作者Suyog Shimpi
相关产品推荐
相关产品推荐

