在Prisma中实现三向关系

时间:2019-09-28 13:08:28

标签: prisma

我还在Prisma forum上问了这个问题。

**编辑**:在我提问后仅1天,该论坛就被锁定为只读状态。肯定会感到恐惧,因为没有官方宣布他们是否会在实现承诺的功能后停止开发Prisma 1。他们当然可以说些什么。而TBH,尽管回购中的星星数量众多,但不稳定的Prisma网站确实增加了我对Prisma的动摇信心。


我是Prisma的新手。因此,我想定义UserEventRole之间的三向关系。对于UserEvent的每个关联,该关联存在一个Role。如果要为另一个ORM设计数据库表,则应该创建一个event_user表,其中将user_idevent_idrole_id作为与它们相关联的列。

实际上,这三列中的一行必须是唯一的。显然,Prisma可以维护这些约束会很好,但是obvious solution I see甚至可能没有来到Prisma 1。

我当前的设计包括以下内容:

type User {
  // ...
  eventUsers: [EventUser!]!
}

type Event {
  // ...
  eventUsers: [EventUser!]!
}

type EventUser {
  role: Role!
  event: Event!
  user: User!
}

此设计将使所有xxWhereUniquexx无法使用,这无疑是维护关系的麻烦。 upsert肯定无法用于维持关系。

如何在Prisma中建立这样的关系?


在某些情况下,每个用户也会有一个全局角色列表,因此UserRole之间已经存在关联。这个问题关系到每个事件的“本地角色”。

1 个答案:

答案 0 :(得分:1)

如果每个用户已经具有各自角色的值,则不需要第三张表(除非您希望将更多信息存储在模式层中,在这种情况下,角色类型应位于角色表)。

使用@relation伪指令设置关系。您可以将其应用于关系中的两个表之一,但为清楚起见,我将它们应用于 Event 表。该示例假定用户可以属于多个事件。

表格:

enum ROLE_TYPE {
 TYPE_ONE 
 TYPE_TWO
}

User {
 user_id: ID! @id
 events: [Event!]!

}

Event {
 event_id: ID! @id
 users: [User!]! @relation(link: INLINE)
}

Role {
 role_id: ID! @id
 type: ROLE_TYPE
 event: Event! @relation(link: INLINE)
 user: User! @relation(link: INLINE)
}

您可以了解有关site棱镜的更多信息