这更像是一个设计问题,而不是一个编码问题。假设以下架构:
// schema.prisma
// Solution 1
model Entity {
id Int @id @default(autoincrement())
attrs EntityAttr[]
}
model EntityAttr {
id Int @id @default(autoincrement())
value Json // or String, doesnt matter much here
// the point is I need to attach info on the
// join table of this relation
attr Attr @relation(fields: [attrId], references: [id])
entity Entity @relation(fields: [entityId], references: [id])
entityId Int
attrId Int
@@unique([entityId, attrId])
}
model Attr {
id Int @id @default(autoincrement())
entities EntityAttr[]
}
// Solution 2
model Entity {
id Int @id @default(autoincrement())
dateAttrs DateAttr[]
recordAttrs RecordAttr[]
// ... this pattern could continue for more Attr-like models
}
model DateAttr {
id Int @id @default(autoincrement())
name String
entity Entity @relation(fields: [entityId], references: [id])
value DateTime // Stronger typing in generated code
}
model RecordAttr {
// ... define another Entity @relation(...)
name String
value String
// ...
}
// ... and so on
Please note that the schema might not be 100% complete or accurate. It is mainly to get the point across.
解决方案 1 的优点是冗余和数据库中的表数量显着减少(取决于Attr
s 的数量)。它的失败来自于令人困惑的查询*
、可能的特定案例类型转换以及value
每个Attr
类似模型的字段没有代码完成。
*
prisma
通过混淆,我的意思是在使用自定义连接表时,简化 mn 查询的选项在功能上被禁用(例如EntityAttr
)
解决方案 2 有其优点,生成的代码会为字段生成更强类型的代码value
,但是它属于生成的表的数量(我实际上不知道更多的表是好事还是坏事,所有我认为如果你有相似的值,它们应该在同一个表中)。
你会在我的鞋子里做什么?