mysql 棱镜多对多关系

sxissh06  于 2023-03-07  发布在  Mysql
关注(0)|答案(1)|浏览(136)

我需要在Teams中包含TeamHomeTeamAway,但我不知道如何实现。
一开始我使用createMany进行优化,但是我不能在createMany中创建一个对象数组,所以我试图解决这个问题。
有什么想法吗?
棱镜v4.10.1

generator client {
    provider = "prisma-client-js"
    previewFeatures = ["clientExtensions"]
}

datasource db {
    provider = "mysql"
    ...
}

model Team {
    ...
    FixturesHome Fixture[]  @relation(name: "home", map: "Fixtures")
    FixturesAway Fixture[]  @relation(name: "away", map: "Fixtures")
    Fixtures     Fixture[]  @relation(name: "FixtureTeams")
    ...
}

model Fixture {
    ...
    TeamHome   Team?       @relation(onDelete: Cascade, fields: [teamHomeId], references: [id], name: "home")
    teamHomeId Int?
    TeamAway   Team?       @relation(onDelete: Cascade, fields: [teamAwayId], references: [id], name: "away")
    teamAwayId Int?
    Teams      Team[]      @relation(name: "FixtureTeams")
    ...
}
0yg35tkg

0yg35tkg1#

首先,您的多对多关系没有连接表。任何多对多关系都需要一个单独的连接表,例如"FixturesOnTeams"模型,它包含Fixture和Team主键的复合主键。
Prisma在这里展示了一个例子:https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations
第二,我想知道您是否需要在两个独立的关系中建模客场队和主队,这是可以作为字段添加到Team模型中的东西,您可以在teamId和type上创建一个复合主键(?你决定什么字段名称在这里合适)并将所有客场球队和主场球队放入一个关系中。您试图将逻辑放入模型的设计中,从而使DB模型的设计变得复杂。这种类型的逻辑应该是您查询的对象,而不是嵌入到表的设计中。

model FixturesOnTeams {
  teamId     Int                 @id @default(autoincrement())
  Team       @relation(fields: [teamId], references: [id])
  fixtureId  Int
  Fixture    @relation(fields: [fixtureId], references: [id])

  @@id([teamId, fixtureId])
}

model Team {
  id         Int                 @unique
  type       String
  Fixtures   FixturesOnTeams[]

  @@id([id, type])
}

model Fixture {
    id         Int                 @id @default(autoincrement())
    Teams      FixturesOnTeams[]      
}

相关问题