TypeORM: Как работает сторона владения?

#sql #typescript #foreign-keys #relational-database #typeorm

Вопрос:

Предположим, у нас есть две модели Profile и User :

 import {Entity, PrimaryGeneratedColumn, Column, OneToOne} from "typeorm";
import {User} from "./User";

@Entity()
export class Profile {
    
    @PrimaryGeneratedColumn()
    id: number;
    
    @Column()
    gender: string;
    
    @Column()
    photo: string;
    
    @OneToOne(() => User, user => user.profile) // specify inverse side as a second parameter
    user: User;
    
}
 
 import {Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn} from "typeorm";
import {Profile} from "./Profile";

@Entity()
export class User {
    
    @PrimaryGeneratedColumn()
    id: number;
    
    @Column()
    name: string;
    
    @OneToOne(() => Profile, profile => profile.user) // specify inverse side as a second parameter
    @JoinColumn()
    profile: Profile;
    
}
 

Я хочу иметь двунаправленную связь между этими двумя моделями, и это работает, я могу найти Profile User и наоборот. Однако, когда я бежал SHOW CREATE TABLE profile , не было никакой ссылки на User модель! Тогда как же это работает? Как я могу найти соединение User Profile сбоку?

Влияет ли это на производительность, на чьей стороне находится владелец? Если нет, то какой смысл думать о том, на чью сторону встать @joinColumn ?

Ответ №1:

Как вы обнаружили, определение пользователя в базе данных не содержит ссылки на профиль, поскольку @JoinColumn в таблице пользователей его нет. @JoinColumn Именно он определяет взаимосвязь внешнего ключа в базе данных. Используется @OneToOne мой тип для создания метаданных и запросов, но это не влияет на схему базы данных.

Примечание: Вы можете иметь только @JoinColumn одну сторону отношения.

Если это настоящие отношения один на один, не имеет значения, на чью сторону вы встанете @JoinColumn .

Если возможно иметь строку профиля без соответствующей строки пользователя, @JoinColumn она должна быть на пользователе.