Как создать четырехуровневую вложенную связь с 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 дня, буду признателен за любую помощь.


person Samet M.    schedule 07.06.2020    source источник


Ответы (2)


Если вы привержены вложенным отношениям, вам придется сделать так, чтобы у типа Service были неуникальные имена. Это заставит создать новую Service модель для каждой компании, но при этом позволит Specialty быть более обобщенными и более удобными для повторного использования.

Логика здесь в том, что если существует несколько Services с одним и тем же именем, но с разными Specialty атрибутами, то они НЕ одинаковы.

person technicallynick    schedule 10.06.2020
comment
Я пробовал этот метод перед публикацией здесь, и он имел другие сложности и не был лучшим решением, потому что последующее обновление имени службы в одной компании повлияло бы только на эту компанию. Я хотел, чтобы Сервисы тоже были уникальными. Итак, я придумал решение, которое сейчас публикую в качестве ответа: - person Samet M.; 15.06.2020

Вот решение, которое я придумал: я храню уникальные имена служб и специальностей в таблицах ServiceItem и SpecialtyItem. Каждый раз, когда я добавляю новый Service в компанию, я связываю этот Service с конкретным ServiceItem, уникальным. Эти Service и Specialty получают информацию (только свойство name в этом проекте) от связанных ServiceItem и SpecialtyItem. Таким образом, всякий раз, когда я обновляю свои ServiceItem или SpecialtyItem, все связанные поля Service и Specialty в каждой компании обновляются. Вот модель данных:

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)
}

person Samet M.    schedule 15.06.2020