gpt4 book ai didi

javascript - 使用 ORM (TypeORM) 设计三维关系

转载 作者:行者123 更新时间:2023-11-29 15:07:27 26 4
gpt4 key购买 nike

我尝试创建一个包含用户、组、文档和权限的数据库模式。

  • 用户可以加入多个群组
  • 组可以有多个用户
  • 用户可以拥有文档的权限
  • 组可以拥有文档的权限
  • 权限可以是任何东西,不只是文档

我试图为此创建一个小图形

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. 我必须如何扩展我的实体以获得这些权限?

...也许您会想出更好的数据库设计:)

最佳答案

在这种情况下,建议手动处理它,创建一个实体类 CrossGroupDocumentPermissionEntity 并为每个关系添加一个 ManyToOne,并在文档、组、用户的另一侧添加一个 OneToMany 关系 here是在 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;
}

关于javascript - 使用 ORM (TypeORM) 设计三维关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58523301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com