Prisma 中的数据建模与关系
Posted
技术标签:
【中文标题】Prisma 中的数据建模与关系【英文标题】:Data modeling in Prisma with relations 【发布时间】:2020-11-29 13:22:29 【问题描述】:我在理解 Prisma 中的关系和数据建模时遇到问题。我有一个关于两个可以参加网球比赛的用户的“简单”示例。所以我有:
Model User
id Int @id
name String
Model Game
id Int @id
player1 PlayerInGame
player2 PlayerInGame
Model PlayerInGame
id Int @id
player User
game Game
它给了我这个错误:
Error validating model "Game": Ambiguous relation detected. The fields `player1` and `player2` in model `Game` both refer to `PlayerInGame`. Please provide different relation names for them by adding `@relation(<name>).
我该如何解决这个问题? 提前致谢。
我也尝试了 @relation 字段,但这给了我以下错误:
model Game
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
player1 PlayerInGame @relation("player1")
player2 PlayerInGame @relation("player2")
Error validating model "Game": Automatic related field generation would cause a naming conflict. Please add an explicit opposite relation field.
【问题讨论】:
【参考方案1】:您可以通过在PlayerInGame
上提供两个关系字段来修复此错误。 Game
上有两个关系字段。因此,您还需要PlayerInGame
上的两个相反关系字段。在您的应用程序逻辑中,您必须确保仅设置这两个关系字段之一。所以根据你的业务领域只需要设置PlayerInGame.gameAsPlayer1
或PlayerInGame.gameAsPlayer2
即可。
model User
id Int @id
name String
model Game
id Int @id
player1 PlayerInGame @relation("GamePlayer1")
player2 PlayerInGame @relation("GamePlayer2")
model PlayerInGame
id Int @id
player User
gameAsPlayer1 Game? @relation("GamePlayer1")
gameAsPlayer2 Game? @relation("GamePlayer2")
【讨论】:
【参考方案2】:最好的方法是多对多关系。您将来也可以向游戏中添加尽可能多的用户,并且可以依次进行扩展。
model User
id Int @id
name String
games Game[]
model Game
id Int @id
name String
users User[]
然后您可以有条件地检查游戏中的玩家数量并在您的业务逻辑中限制他们。
【讨论】:
感谢您的回答。但是,当我想添加一些统计数据时,这是否也有效,比如赢得的比赛、ace 等?每个游戏和用户都会有所不同,这就是我考虑添加 PlayerInGame 的原因。以上是关于Prisma 中的数据建模与关系的主要内容,如果未能解决你的问题,请参考以下文章