设计一个用户可以访问任务的系统
Designing a system in which user can give access to tasks
我正在设计一个小型系统,其中将有两个模型(当前)。
- 用户
- 任务
用户可以创建任务。并且可以邀请另一个用户执行任务并授予他只读或读写访问权限。我能够为它们中的每一个创建模型,但我无法弄清楚与用户访问相关的关系。
这是我的模型
// user.entity.ts
@Entity()
@Unique(['email'])
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
email: string;
@Column()
first_name: string;
@Column()
last_name: string;
@Exclude()
@Column()
password: string;
@OneToMany(() => Task, (task) => task.user, { eager: true })
task: Task[];
}
// task.entity.ts
@Entity()
export class Task extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
content: string;
@Exclude()
@ManyToOne(() => User, (user) => user.task, { eager: false })
user: User;
@Column()
userId: number;
}
我对数据库和模型还很陌生。我想创建一个将 task_id、user_id、access_role 作为列的实体,但我无法从中前进。
你所描述的 M:M 之间的关系 User:Task。这些类型关系通常用交集 table 来解决——你对另一个实体的想法是正确的。在这种情况下可能 User_Task table。交集 table 通常包含与该组合相关的属性。这将是用户对任务的授权。所以这里是这样的:(假设 user_id 是 PK 到用户 table 和 task_id 是 PK 到任务 table 并且每个都是整数:(对不起,我必须只给出 SQL 因为我不知道你的混淆层 - TypeORM?)
create table user_task
( user_id integer
, task_id integer
, access text constraint access_ck check (access in ('RO', 'RW'))
, constraint user_task_pk
primary key (user_id, task_id)
, constraint user_task_2_user_fk
foreign key (user_id)
references users(user_id)
, constraint user_task_2_task_fk
foreign key (task_id)
references tasks(task_id)
);
上面描述了最小的情况,现在是困难的部分。这涉及到你的设计:
仅考虑Task_1:
- 用户可以邀请自己吗?第一个用户如何分配给
任务?
- 当user_a邀请user_b时,user_a是否有进一步的影响或作用
关于 user_b 任务关系。如果是什么?
- user_b现在可以邀请user_c吗?任何时间,或取决于访问权限。
- user_a 邀请 user_c 之后 user_b 邀请会发生什么
user_c?
- 当访问权限不同时,上面会发生什么。
我相信还有很多其他人。上面的答案可能会更改 table 列。
我正在设计一个小型系统,其中将有两个模型(当前)。
- 用户
- 任务
用户可以创建任务。并且可以邀请另一个用户执行任务并授予他只读或读写访问权限。我能够为它们中的每一个创建模型,但我无法弄清楚与用户访问相关的关系。
这是我的模型
// user.entity.ts
@Entity()
@Unique(['email'])
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
email: string;
@Column()
first_name: string;
@Column()
last_name: string;
@Exclude()
@Column()
password: string;
@OneToMany(() => Task, (task) => task.user, { eager: true })
task: Task[];
}
// task.entity.ts
@Entity()
export class Task extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
content: string;
@Exclude()
@ManyToOne(() => User, (user) => user.task, { eager: false })
user: User;
@Column()
userId: number;
}
我对数据库和模型还很陌生。我想创建一个将 task_id、user_id、access_role 作为列的实体,但我无法从中前进。
你所描述的 M:M 之间的关系 User:Task。这些类型关系通常用交集 table 来解决——你对另一个实体的想法是正确的。在这种情况下可能 User_Task table。交集 table 通常包含与该组合相关的属性。这将是用户对任务的授权。所以这里是这样的:(假设 user_id 是 PK 到用户 table 和 task_id 是 PK 到任务 table 并且每个都是整数:(对不起,我必须只给出 SQL 因为我不知道你的混淆层 - TypeORM?)
create table user_task
( user_id integer
, task_id integer
, access text constraint access_ck check (access in ('RO', 'RW'))
, constraint user_task_pk
primary key (user_id, task_id)
, constraint user_task_2_user_fk
foreign key (user_id)
references users(user_id)
, constraint user_task_2_task_fk
foreign key (task_id)
references tasks(task_id)
);
上面描述了最小的情况,现在是困难的部分。这涉及到你的设计:
仅考虑Task_1:
- 用户可以邀请自己吗?第一个用户如何分配给 任务?
- 当user_a邀请user_b时,user_a是否有进一步的影响或作用 关于 user_b 任务关系。如果是什么?
- user_b现在可以邀请user_c吗?任何时间,或取决于访问权限。
- user_a 邀请 user_c 之后 user_b 邀请会发生什么 user_c?
- 当访问权限不同时,上面会发生什么。
我相信还有很多其他人。上面的答案可能会更改 table 列。