проектирование трехмерных отношений с ORM (TypeORM) - PullRequest
3 голосов
/ 23 октября 2019

Я пытался создать схему базы данных с пользователями, группами, документами и разрешениями.

  • пользователи могут объединяться в несколько групп
  • группы могут иметь несколько пользователей
  • пользователи могут иметь разрешения для документов
  • группы могут иметь разрешения для документов
  • разрешения могут быть любыми, не только для документов

Я пытался создать небольшую графику длячто

enter image description here

Я начал проектировать объекты

Пользователь

@Entity('User')
export class UserEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @ManyToMany((type: any) => GroupEntity, (group: GroupEntity) => group.users)
  @JoinTable()
  groups: GroupEntity[];

  @ManyToMany((type: any) => DocumentEntity, (document: DocumentEntity) => document.users)
  @JoinTable()
  documents: DocumentEntity[];
}

Группа

@Entity('Group')
export class GroupEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @ManyToMany((type: any) => UserEntity, (user: UserEntity) => user.groups)
  users: UserEntity[];

  @ManyToMany((type: any) => DocumentEntity, (document: DocumentEntity) => document.groups)
  @JoinTable()
  documents: DocumentEntity[];
}

Документ

@Entity('Document')
export class DocumentEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @ManyToMany((type: any) => UserEntity, (user: UserEntity) => user.documents)
  users: UserEntity[];

  @ManyToMany((type: any) => GroupEntity, (group: GroupEntity) => group.documents)
  groups: GroupEntity[];
}

Когда дело доходит до документов для документов, вы увидите, что существует связь между 3 таблицами,пользователи / группы, документы и разрешения.

  1. Я использую TypeORM для REST API (NestJs), и я не уверен, является ли разрешение сущностью. В связи с тем, что я проектирую конечные точки REST, эта сущность разрешений будет общей сущностью для нескольких конечных точек.

  2. Как мне расширить мои сущности для этих разрешений?

... и, возможно, вы могли бы придумать лучший дизайн базы данных:)

1 Ответ

1 голос
/ 24 октября 2019

В этом случае рекомендуется обработать его вручную, создать класс сущности CrossGroupDocumentPermissionEntity и добавить ManyToOne для каждого отношения, а с другой стороны в Документ, Группу, Пользователь добавить отношение OneToMany здесь - этопример использования в ManyToMany с настраиваемыми полями

Редактировать:

Пользователь

@Entity('User')
export class UserEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @ManyToMany((type: any) => GroupEntity, (group: GroupEntity) => group.users)
  @JoinTable()
  groups: GroupEntity[];

  @OneToMany((type: any) => CrossUserDocumentPermissionEntity, (documentPermission: CrossUserDocumentPermissionEntity) => documentPermission.user)
  documentPermissions: CrossUserDocumentPermissionEntity[];
}

Группа

@Entity('Group')
export class GroupEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @ManyToMany((type: any) => UserEntity, (user: UserEntity) => user.groups)
  users: UserEntity[];

  @OneToMany((type: any) => CrossGroupDocumentPermissionEntity, (documentPermission: CrossGroupDocumentPermissionEntity) => documentPermission.group)
  documentPermissions: CrossGroupDocumentPermissionEntity[];
}

Разрешение

@Entity('Permission')
export class PermissionEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @OneToMany((type: any) => CrossUserDocumentPermissionEntity, (userDocument: CrossUserDocumentPermissionEntity) => userDocument.permission)
  usersDocuments: CrossUserDocumentPermissionEntity[];

  @OneToMany((type: any) => CrossGroupDocumentPermissionEntity, (groupDocument: CrossUserDocumentPermissionEntity) => groupDocument.permission)
  GroupDocuments: CrossGroupDocumentPermissionEntity[];
}

Документ

@Entity('Document')
export class DocumentEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @OneToMany((type: any) => CrossUserDocumentPermissionEntity, (userPermission: CrossUserDocumentPermissionEntity) => userPermission.document)
  usersPermissions: CrossUserDocumentPermissionEntity[];

  @OneToMany((type: any) => CrossGroupDocumentPermissionEntity, (groupPermission: CrossUserDocumentPermissionEntity) => groupPermission.document)
  GroupPermissions: CrossGroupDocumentPermissionEntity[];
}

Cross_User_Document_Permission

@Entity('Cross_User_Document_Permission')
export class CrossUserDocumentPermissionEntity {
  @PrimaryColumn()
  userId: string;

  @PrimaryColumn()
  permissionId: string;

  @PrimaryColumn()
  documentId: string;

  @ManyToOne((type: any) => UserEntity, (user: UserEntity) => user.documentPermission)
  user: UserEntity;

  @ManyToOne((type: any) => DocumentEntity, (document: DocumentEntity) => document.userPermission)
  document: DocumentEntity;

  @ManyToOne((type: any) => PermissionEntity, (permission: PermissionEntity) => permission.userDocument)
  permission: PermissionEntity;
}
...