我正在构建一个包含3种基本实体类型的PHP应用程序:Coach,Student,Lesson,其中教练为学生创建数字课程。我正在使用MySQL和innoDB表。
要求
我不确定在给定要求的情况下使用哪种最佳数据库架构。这有两个选择:
选项1
用户(PK id,user_type(教练或学生),名字,姓氏,电子邮件,密码等...)
课程(PK id,FK coach_user_id(ref:User.id),FK student_user_id(ref:User.id),lesson_name等...)
优点:
- 一个用户表
- 每个用户都有一个唯一的ID和电子邮件
- 使用单个表格轻松登录auth
缺点:
- 当教练或学生User.id在课程表中记录为FK时,不验证user_type。此问题将在任何需要将教练或学生User.id记录为FK的新表中重新出现
- 潜在的多态性问题以及规范化轨道的必要性。
选项2
教练(PK id,名字,姓氏,电子邮件,密码等......)
学生(PK id,名字,姓氏,电子邮件,密码等......)
课程(PK id,FK coach_id(ref:Coach.id),FK student_id(ref:Student.id),lesson_name,lesson_text等......)
优点:
- 规范化数据库架构。独立教练,学生实体表
- 没有用户类型验证问题。教练ID和学生ID FK分别独立于Coach.id和Student.id。
缺点:
- 教练和学生可以拥有相同的身份证。 (这可以通过ID前缀解决,例如C1001,S1001)
- 教练和学生可以收到相同的电子邮件
- 登录身份验证包括查询两个2个表用于单个登录页面,或创建2个不同的登录页面和身份验证请求类型。
我真的被撕裂了,这是最好的方式。有更好的方法吗?
答案 0 :(得分:2)
在我看来,你的两种方法都有效。第一个是更普遍的,并且能够适应各种当前未知的要求。如果你选择它,我建议在模型中添加Role的概念 - “user_type”是一个角色,一个用户可以[同时]与不同的角色相关联。此外,Len Silverston的“数据模型资源手册”是一个很好的资源。
但是,您可能并不总是希望您的架构过于笼统。您列出了非常低级别的2种方法的优缺点;我认为实用性比特定的技术问题更重要(可以克服)。我是这么说的:
1)优点:
缺点:
2)优点:
缺点:
我希望它有意义并帮助您做出符合您需求的正确决定。
答案 1 :(得分:1)
选项1对我来说更好看。
如果您不想区分学生和教练,它会简化您的代码,如果您想区分它们,它将与选项2完全相同。
如果你真的需要验证外键,你可以使用触发器检查它是否是教练。
我不确定你的意思“潜在的多态性问题以及规范化轨道的必要性。”。