php - 数据库设计: Multiple User Entities. 单个或多个表

标签 php mysql sql database-design schema

我正在构建一个 PHP 应用程序,它有 3 种基本实体类型:教练、学生、类(class),教练在其中为学生创建数字类(class)。我正在使用 MySQL 和 innoDB 表。

要求

  1. 教练和学生登录。
  2. 教练可以专门为单个学生提供数字类(class)。

我不确定根据要求使用的最佳数据库架构是什么。这里有两个选项:

选项 1
用户(PK ID、用户类型(教练或学生)、名字、姓氏、电子邮件、密码等...)
类(class)(PK id、FK coach_user_id(引用:User.id)、FK Student_user_id(引用:User.id)、lesson_name 等...)

优点:
- 一张用户表
- 每个用户都有一个唯一的ID和电子邮件
- 使用单个表使登录身份验证变得容易

缺点:
- 当教练或学生 User.id 在类(class)表中记录为 FK 时,不会验证 user_type。在任何需要将教练或学生 User.id 记录为 FK 的新表中都会再次出现此问题。
- 潜在的多态性问题以及正常化的需要。

选项 2
教练(PK ID、名字、姓氏、电子邮件、密码等...)
学生(PK ID、名字、姓氏、电子邮件、密码等...)
类(class)(PK id、FK coach_id(引用:Coach.id)、FK Student_id(引用:Student.id)、lesson_name、lesson_text 等...)

优点:
- 标准化数据库模式。独立教练、学生实体表。
- 没有用户类型验证问题。教练ID和学生ID FK分别独立指向Coach.id和Student.id。

缺点:
- 教练和学生可以有相同的ID。 (这可以通过 ID 前缀来解决,例如 C1001、S1001)
- 教练和学生可以使用相同的电子邮件。
- 登录身份验证涉及查询单个登录页面的两个 2 表,或创建 2 个不同的登录页面和身份验证请求类型。

我真的很困惑,这是最好的选择。有更好的方法吗?

最佳答案

在我看来,你的两种方法都可行。第一个更通用,能够满足各种当前未知的要求。如果您选择它,我建议将角色的概念添加到模型中 - “user_type”是一种角色,一个用户可以[同时]与不同的角色关联。此外,Len Silverston 的《数据模型资源书》也是一个很好的资源。

但是,您可能并不总是希望您的架构过于笼统。您在非常低的水平上列出了两种方法的优缺点;我认为实用性比特定的技术问题(可以克服)更重要。我会这样说:

1)优点:

  • 无需对架构进行重大更改即可轻松适应新功能
  • 非常灵活
  • 轻松在架构之上构建多维数据集
  • 适合长期项目

缺点:

  • 需要更多资源(经验丰富的 DBA/数据模型专家,相对较长的设计时间)
  • 比 (2) 复杂得多

2)优点:

  • 快速交付第一个工作版本
  • 即使是非技术人员也很容易理解(直到它长大)
  • 适合小型项目或具有明确定义领域且[几乎]永远不会改变的项目

缺点:

  • 随着新需求的出现,永无休止的架构重构
  • 如果项目生命周期足够长,数据库就会充满“不再使用”的列(或其他数据库对象),没人愿意碰触
  • 更难保证诚信

我希望它有意义,并帮助您做出适合您需求的正确决定。

关于php - 数据库设计: Multiple User Entities. 单个或多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18787013/

相关文章:

javascript - 如何关闭我的单个选项卡

php - iOS 尝试将位置更新发布到服务器

php - 使用分页查看目录中的文件 - php

mysql right join where 在一个子句上返回空

mysql - 检查具有事件状态的记录或获取状态字段然后检查哪个更好

php - 确定 WooCommerce 中的产品类型 - fatal error : Call to a member function is_type() on null

mysql - 将 sql.qz 上传到站点时访问被拒绝 (#1227)

php - 无法使用 base64_encode 显示 blob 图像

按连续外键​​值分组的 MySQL 查询

php - 难以创建指向 MySQL 表中存储文件的链接