mysql - 当某些列仅在某些情况下适用时,为 1 对 1 关系设计数据库

标签 mysql sql-server database postgresql database-design

我有一个用户表,它存储两类用户的详细信息,即学生和教师。学生和老师共有10个字段,例如用户名,密码等。这里的任何数据都没有1对n的关系。

如果是学生,我必须存储 20 个不同的 1 对 1 数据,例如体重、出生日期、入学编号、家长、电话号码等。

如果是教师,我必须单独存储一组 20 个一对一的数据,例如电子邮件 ID、单位编号等,这些数据与学生没有任何关系。

在下面的这种情况下,我可以使用的最佳数据库结构是什么?如果有更好的选择,也请提供。

  1. 一张表有 50 列,其中 20 列对于学生为 NULL,20 列对于教师为 NULL

  2. 一个包含 30 列的表,其中前 10 列存储公共(public)数据,接下来的 20 列存储学生详细信息(如果是学生)和教师数据(如果是教师)。

  3. 两个表,其中一个包含 10 列,用于存储用户详细信息。另一个包含 20 列的表用于存储学生的详细信息(如果是学生)和教师的数据(如果是教师)。

  4. 三个表,一个包含 10 列,用于存储用户详细信息。另一个包含 20 列的表用于存储学生的详细信息,另一个包含 20 列的表用于存储教师的数据

最佳答案

单表继承和类表继承都可以。事实上,Fowler 已经为敏捷推荐了 STI。如果你使用像 Hibernate 这样的好 ORM,区别就很小了。如果您使用 PostgreSQL,您的空值也不会占用任何额外空间。

话虽如此,您应该进一步规范化您的表格(例如, parent 的电话号码应该在差异表格中)。参见 https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831寻求帮助

关于mysql - 当某些列仅在某些情况下适用时,为 1 对 1 关系设计数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29257089/

相关文章:

sql - 给定一个列名,我如何找到数据库中的哪些表包含该列?

c++ - 文件同步库

php - 无法在php中使用mysql查询插入数据

sql - 排序、排序、筛选 SQL Server 的复杂组合

sql - 如何在SQL Server中将自定义字符串转换为日期

sql - 如果表不存在则创建

php - 如何接收数据库中的最后一行ID?

mysql - 使用 LIKE MySQL 从两个表中提取信息

php - Prestashop 数据库异常

mysql - 更新或插入具有 6000 万条条目的 mysql 数据库