#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
она должна быть на пользователе.