我正在构建一个具有 3 种基本实体类型的 PHP 应用程序:教练、学生、课程,教练在其中为学生创建数字课程。我正在使用 MySQL 和 innoDB 表。
要求
- 教练和学生登录。
- 教练可以专门为单个学生提供数字课程。
我不确定根据要求使用的最佳数据库模式是什么。这里有两个选项:
选项 1
用户(PK id、user_type(教练或学生)、名字、姓氏、电子邮件、密码等...)
课程(PK id、FK coach_user_id(参考:User.id)、FK student_user_id(参考:User.id) )、课程名称等...)
优点:
- 一个用户表
- 每个用户都有唯一的 ID 和电子邮件
- 使用单个表使登录验证变得容易
缺点:
- 当教练或学生 User.id 在课程表中记录为 FK 时,不验证 user_type。此问题将在需要将教练或学生 User.id 记录为 FK 的任何新表中再次出现。
- 潜在的多态性问题和规范化的需要。
选项 2
教练(PK id、名字、姓氏、电子邮件、密码等)
学生(PK id、名字、姓氏、电子邮件、密码等)
课程(PK id、FK coach_id(参考:Coach. id),FK student_id(参考:Student.id),课程名称,课程文本等...)
优点:
- 标准化数据库模式。独立教练,学生实体表。
- 没有用户类型验证问题。Coach ID 和Student ID FK 分别独立指向Coach.id 和Student.id。
缺点:
- 教练和学生可以拥有相同的 ID。(这可以通过 ID 前缀来解决,例如 C1001、S1001)
- 教练和学生可以使用相同的电子邮件。
- 登录身份验证涉及为单个登录页面查询两个 2 表,或创建 2 个不同的登录页面和身份验证请求类型。
我真的很伤心,这是最好的方法。有一个更好的方法吗?