【问题标题】:How to manage tables for users in my database?如何为我的数据库中的用户管理表?
【发布时间】:2021-02-03 19:19:25
【问题描述】:

假设我有一个教师实体和一个学生实体。他们都有电子邮件和密码,但老师和学生都有额外的列。那么,它会是不同的表吗?但在这种情况下,我会为每个人创建身份验证模块、控制器、jwt 策略和所有东西。如何让它们保持在同一张表中,但根据角色进行扩展?

附言澄清一下:

这是我的护照策略。我需要在这里使用teacherService。学生也一样。大量冗余代码。而且这不是唯一的情况。

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor(private authService: AuthService) {
    super({
      usernameField: 'email'
    });
  }
  async validate(email: string, password: string): Promise<Teacher | Student> {
    return this.authService.getAuthenticatedUser(email, password);
  }
}

【问题讨论】:

  • 为什么不创建一个用户实体,然后让教师和学生实体通过外键链接到单个用户实体?我认为那会更接近 BCNF。
  • @SumnerEvans,我想过这个,它会非常好,但我不知道如何动态链接到特定的表。好的,我有 BaseUser 实体,其中包含电子邮件、密码、角色和另一个表的外键,其中包含其余列。但我不只有一个实体。我至少有两个:学生和老师。如何根据角色将用户链接到特定表(学生或教师)?

标签: node.js nestjs typeorm


【解决方案1】:

将特定数据放在 JSON 列中。这样一来,您就可以为所有教师和学生提供一张桌子。

class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    email: string;

    @Column()
    password: string;

    @Column({ type: 'json' })
    data: any;     //  <---------- The specific data goes into here.
}

更新

要申请join,它们应该是单独的实体:

class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    email: string;

    @Column()
    password: string;

    @Column()
    role: 'teacher' | 'student';
}

class Student {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    userId: string;
    
    ...
}

class Teacher {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    userId: string;
    
    ...
}

【讨论】:

  • 但是如果以后我希望这些数据与其他表有另一个联接呢?
  • 要加入表格,您需要将它们作为单独的表格。 UserTeacherStudentUser 有一个名为role 的属性,它可以是teacherstudent。而UserTeacher 实体有userId 列。
  • 并根据数据(json)列加入用户和教师/学生?它会起作用吗?
  • 没有。此时,data 将不存在。让我更新我的答案
  • 那么如何加入他们呢?据我所知,关系装饰器必须在双方。这是我的问题:我不知道如何为两个表创建通用列:学生和教师。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
相关资源
最近更新 更多