【发布时间】:2016-03-25 20:56:06
【问题描述】:
我正在构建一个具有 3 种基本实体类型的 PHP 应用程序:教练、学生、课程,其中教练为学生创建数字课程。我正在使用 MySQL 和 innoDB 表。
要求
- 教练和学生登录。
- Coach 可以专门为单个学生提供数字课程。
我不确定根据要求使用的最佳数据库架构是什么。这里有两个选项:
选项 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 个不同的登录页面和身份验证请求类型。
我真的很伤心,这是最好的方法。有没有更好的方法来做到这一点?
【问题讨论】:
标签: php mysql sql database-design schema