Как через sequelize-typescript создать связь 1-к-1 с возможностью каскадного удаления?

Имеются 2 модели

User:
@Table({
    underscored: true,
    tableName: "user",
    modelName: "User"
})
export class User extends Model {
    @IsUUID(4)
    @PrimaryKey
    @Column
    readonly id!: string;

    @Column({
        type: DataType.STRING,
        unique: true
    })
    readonly email!: string;

    @Column({
        type: DataType.STRING
    })
    public password: string;

    @Column({
        type: DataType.STRING
    })
    public salt: string;

    @Column({
        type: DataType.BOOLEAN,
    })
    public confirmed: boolean;

    @Column({
        type: DataType.BOOLEAN,
    })
    public activated: boolean;

    @Column({
        type: DataType.STRING
    })
    public code: string;

    @Column({
        allowNull: true,
        type: DataType.DATE
    })
    public emailSendedAt: number | null;

    @HasOne(() => Profile, {
        onDelete: "CASCADE",
        onUpdate: "CASCADE",
        foreignKey: "userId",
    })
    public profileId: string | null;
}


Profile
@Table({
    underscored: true,
    tableName: "profile",
    modelName: "Profile"
})
export class Profile extends Model {
    @IsUUID(4)
    @ForeignKey(() => User)
    @PrimaryKey
    @Column({
        onDelete: "CASCADE",
        onUpdate: "CASCADE",
    })
    readonly id!: string;

    @Column({
        type: DataType.STRING,
        unique: true
    })
    readonly email!: string;

    @Column({
        allowNull: false,
        type: DataType.JSONB
    })
    public modelRoot!: object;

    @Column({
        allowNull: false,
        type: DataType.INTEGER,
    })
    public updateCounter!: number;
}


В базе создается модель User, после чего создается модель Profile.
const profile: ProfileDBModel = {
            id: uuidv4(),
            email: params.email
            modelRoot: params.modelRoot,
            updateCounter: 0,
        };
await Profile.create(profile)


На этапе Profile.create получаю ошибку такого формата:
insert or update on table \"profile\" violates foreign key constraint \"profile_id_fkey\"


Как это можно пофиксить?
  • Вопрос задан
  • 252 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
1:1 - это плохая идея с точки зрения БД. Создайте просто одну таблицу и разделите ее условно на 2 части.
Это будет работать быстро и эффективно. И никаких JOINS. Несуществующие поля - заменяйте на nulls.

C sequelize-typescript я не работал. Не знаю как оно там. Но лучше не создавать технических долгов еще на проектировании. Потом вам легче будет жить.
Ответ написан
@Wirusnyy-chel
У вас 2 таблицы, user и profile. У пофиля id это внешний ключ на таблицу пользователей. Поэтому если туда можно записывать только значения которые содержаться в колонке id пользователей. Соответственно перед тем как записывать в таблицу профилей нужно создать запись с таким id в таблице пользователей
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 00:16
2000 руб./за проект
22 нояб. 2024, в 23:55
3000 руб./за проект
22 нояб. 2024, в 22:26
3500 руб./за проект