postgresql Prisma:如何将多个列链接到同一数据类型

new9mtju  于 2023-01-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(207)

刚接触关系数据库,我在一个项目中使用Prisma、Postgres和Nextjs。我正在向客户发送电子邮件,并希望存储这些电子邮件,但不完全了解关系是如何工作的,以使其完全工作。
我有与客户相关的电子邮件收件人。这里有一个名称和电子邮件地址。

model email_recipient {
  id            String   @id(map: "pk_email_recipient") @db.Uuid
  name          String   @db.VarChar(255)
  email_address String   @db.VarChar(255)
  customer_id   String   @unique @db.Uuid
  customer      customer @relation(fields: [customer_id], references: [id])
}

我有一个电子邮件模型,有tocc,和bcc列,可以是多个电子邮件收件人,收件人可以存在于所有三个列中。

model email {
  id                 String    @id(map: "pk_email") @db.Uuid
  body               String?   @db.Text
  created_date       DateTime? @db.Timestamp(6)
  last_modified_date DateTime? @db.Timestamp(6)
  to                 email_recipient[]
  cc                 email_recipient[]
  bcc                email_recipient[]
}

Prisma尝试为我生成关系,但我没有完全工作,因为它添加了3次相同名称的字段,就像这样。

model email_recipient {
  id            String   @id(map: "pk_email_recipient") @db.Uuid
  name          String   @db.VarChar(255)
  email_address String   @db.VarChar(255)
  customer_id   String   @unique @db.Uuid
  customer      customer @relation(fields: [customer_id], references: [id])
  user          user[]
  email         email?   @relation(fields: [emailId], references: [id])
  emailId       String?  @db.Uuid
  email         email?   @relation(fields: [emailId], references: [id])
  emailId       String?  @db.Uuid
  email         email?   @relation(fields: [emailId], references: [id])
  emailId       String?  @db.Uuid
  // Clearly an issue here, but not prismas fault, its just trying its best.
}

我尝试在中间添加一个带有接收者类型枚举的中间表,但无法使其工作。我认为这是正确的解决方案,但这是我对关系的理解失败的地方。

mhd8tkvw

mhd8tkvw1#

看起来您试图在email和email_recipient模型之间创建一个多对多关系,其中一封邮件可以有多个收件人(to、cc、bcc),并且一个收件人可以与多封邮件相关联,但是,您在email模型中使用to、cc和bcc字段定义关系的方式导致Prisma在email_recipient模型中生成重复字段。
解决此问题的一种方法是创建一个中间表(也称为连接表)来处理多对多关系。此表将包含电子邮件ID列和收件人ID列,以及指示收件人类型的附加列(to、cc、bcc)。这样,单个收件人可以在连接表中具有多行,每行具有不同的收件人类型。
以下是新中间表的外观示例:

model email_recipient_association {
  id              String   @id(map: "pk_email_recipient_association") @db.Uuid
  email_id        String   @db.Uuid
  email           email    @relation(fields: [email_id], references: [id])
  recipient_id    String   @db.Uuid
  recipient       email_recipient @relation(fields: [recipient_id], references: [id])
  recipient_type  RecipientType  // Enum with to, cc, bcc values
}
enum RecipientType {
  to
  cc
  bcc
}

然后,您可以从电子邮件模型中删除“收件人”、“抄送”和“密件抄送”字段

相关问题