Как представить двустороннее отношение взаимной дружбы в БД?

Рейтинг: 0Ответов: 0Опубликовано: 14.04.2023

Я хочу реализовать взаимные дружеские связи между пользователями в базе данных.
Но как лучше всего представить такую связь в БД? Возможно ли это?

Для примера я возьму образец из Prisma.
Отношение подписчика реализовано там так, хотя оно не гарантирует взаимности:

CREATE TABLE "User" (
    id integer DEFAULT nextval('"User_id_seq"'::regclass) PRIMARY KEY,
    name text
);
CREATE TABLE "_UserFollows" (
    "A" integer NOT NULL REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE,
    "B" integer NOT NULL REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE
);
model User {
  id         Int       @id @default(autoincrement())
  name       String?
  followedBy Follows[] @relation("following")
  following  Follows[] @relation("follower")
}

model Follows {
  follower    User @relation("follower", fields: [followerId], references: [id])
  followerId  Int
  following   User @relation("following", fields: [followingId], references: [id])
  followingId Int

  @@id([followerId, followingId])
}

Кроме того, каким образом я могу сделать так,
чтобы при удалении связи с одной стороны, удалялась и связь с другой стороны?

Как я могу обеспечить целостность данных и атомарность изменений?

Ответы

Ответов пока нет.