刚接触关系数据库,我在一个项目中使用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])
}
我有一个电子邮件模型,有to
,cc
,和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.
}
我尝试在中间添加一个带有接收者类型枚举的中间表,但无法使其工作。我认为这是正确的解决方案,但这是我对关系的理解失败的地方。
1条答案
按热度按时间mhd8tkvw1#
看起来您试图在email和email_recipient模型之间创建一个多对多关系,其中一封邮件可以有多个收件人(to、cc、bcc),并且一个收件人可以与多封邮件相关联,但是,您在email模型中使用to、cc和bcc字段定义关系的方式导致Prisma在email_recipient模型中生成重复字段。
解决此问题的一种方法是创建一个中间表(也称为连接表)来处理多对多关系。此表将包含电子邮件ID列和收件人ID列,以及指示收件人类型的附加列(to、cc、bcc)。这样,单个收件人可以在连接表中具有多行,每行具有不同的收件人类型。
以下是新中间表的外观示例:
然后,您可以从电子邮件模型中删除“收件人”、“抄送”和“密件抄送”字段