Prisma多对多自关联优化:如何用单个字段实现好友关系?
用Prisma实现单字段双向好友关联
当然可以,既然好友关系是双向无差别的,你可以通过调整关联关系定义,让User模型只保留一个字段来获取所有好友。
核心思路是让中间表的两个用户关联使用同一个关系名称,这样Prisma会将双向的好友关系合并到单个字段中。修改后的模型如下:
model User { id Int @id @default(autoincrement()) name String? friends Friend[] @relation("Friendship") } model Friend { user1 User @relation("Friendship", fields: [userId1], references: [id]) userId1 Int user2 User @relation("Friendship", fields: [userId2], references: [id]) userId2 Int // 联合主键确保同一好友关系不会重复存储 @@id([userId1, userId2]) // 可选:添加数据库层面的约束,避免存储重复的双向关系(比如userId1必须小于userId2) @@map("friends") }
查询好友列表
查询某个用户的所有好友时,只需要包含friends字段,并关联查询对应的另一方用户即可:
const userWithFriends = await prisma.user.findUnique({ where: { id: 1 }, include: { friends: { include: { user2: true } } } }); // 提取所有好友信息 const friends = userWithFriends.friends.map(friend => friend.user2);
注意事项
为了避免重复存储同一好友关系(比如同时存储(1,2)和(2,1)),建议在创建好友关系时做个简单处理:将ID较小的用户放在userId1,较大的放在userId2。这样既节省存储空间,也能避免查询时出现重复的好友条目。
内容的提问来源于stack exchange,提问作者JSim
相关产品推荐
相关产品推荐

