如何使用 Prisma 创建 4 级嵌套关系

How to create 4-level nested relationship with Prisma

我有 3 种主要类型:公司、服务和专业。每家公司都有一份服务清单。每个服务都有一个专业列表。每个专业都有一个专业(子专业)列表。

Company 1
- Service 1
-- Specialty 1
--- Sub-specialty 1

所以 我正在 Prisma 1.34 上处理这个数据模型:

type Company {
  id: ID! @id
  name: String! @unique
  services: [Service]
}
type Service {
  id: ID! @id
  name: String! @unique
  companies: [Company]! @relation(link: TABLE)
  specialties: [Specialty]
}
type Specialty {
  id: ID! @id
  name: String! @unique
  companies: [Company]! @relation(link: TABLE)
  services: [Service] @relation(link: TABLE)
  sub_specialties: [Specialty] @relation(link: TABLE)
}

我的问题是,当我添加一家公司并在另一家公司为该公司使用相同的服务时,所有其他专业和子专业记录都随该服务一起提供。我想让每个公司的专业和子专业字段都是唯一的,但它们也应该在每个公司的相关服务下。

过去 3 天我一直在努力,如果有任何帮助,我将不胜感激。

如果您致力于嵌套关系,那么您将不得不使 Service 类型具有非唯一名称。这将强制为每个公司创建一个新的 Service 模型,同时仍然允许 Specialty 更通用并更好地重用。

这里的逻辑是,如果有多个 Services 具有相同的名称但具有不同的 Specialty 属性,那么它们是不相同的。

这是我想出的解决方案:我在 ServiceItemSpecialtyItem 表中持有唯一的服务和专业名称。每当我向一家公司添加一个新的 Service 时,我 link 那个 Service 到一个特定的 ServiceItem 是唯一的。 ServiceSpecialty 从 linked ServiceItemSpecialtyItem 接收信息(在这个项目中只有 name 属性)。这样,每当我更新 ServiceItemSpecialtyItem 时,每个公司下的所有相关 ServiceSpecialty 字段都会更新。这是数据模型:

type Company {
  id: ID! @id
  name: String! @unique
  services: [Service]! @relation(onDelete: CASCADE)
}

type ServiceItem {
  id: ID! @id
  name: String! @unique
}

type Service {
  id: ID! @id
  info: ServiceItem! @relation(link: INLINE)
  company: Company! @relation(link: INLINE)
  specialties: [Specialty] @relation(onDelete: CASCADE)
}

type SpecialtyItem {
  id: ID! @id
  name: String! @unique
}

type Specialty {
  id: ID! @id
  info: SpecialtyItem! @relation(link: INLINE)
  service: Service @relation(link: INLINE)
  sub_specialties: [Specialty] @relation(onDelete: CASCADE)
}