当某些列仅适用于某些情况时,设计1对1关系的数据库

时间:2015-03-25 13:29:28

标签: mysql sql-server database postgresql database-design

我有一个用户表,用于存储两类用户的详细信息,即学生和教师。学生和教师共有10个字段,如用户名,密码等。如果有任何数据,则没有1到n的关系。

如果是学生,我必须存储20个不同的1对1数据,如体重,DOB,入场号,家长,电话号码等。

如果是教师,我必须存储一组二十一对一的数据,如电子邮件ID,联系号码等,这与学生无关。

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

  1. 一个包含50列的表,其中20列在学生的情况下为NULL,在教师的情况下为20列将为NULL

  2. 一个包含30列的表格,其中前10列存储公共数据,接下来的20列存储学生详细信息,以防学生和教师的数据用于教师。

  3. 两个表格,其中10列用于存储用户详细信息。另有一个包含20列的表格,用于存储学生详细信息,以及学生和教师的数据,以及教师的情况。

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

4 个答案:

答案 0 :(得分:0)

你必须记住关系设计的原则。所有列都应该依赖于关键字段,而只取决于关键字段。

最好选择4个表:

1) For a base person details (columns teachers and students both have).
2) A teacher table for details that pertain to only teachers. This will relate to base person table with a foreign key (just like table 3).
3) A student table for details that pertain to only students.

没有额外的空列,并且在查询类型(其中一些你没有预料到)中非常灵活,你将能够做到。

答案 1 :(得分:0)

我想到的第一件事是猪耳关系,一个链接实体,这样你就可以有ID,teacherID,studentID来显示哪些老师教哪些学生,但后来我意识到这不是你要求的。 ..

为什么不只有一个布尔值,如果是老师则为true,否则为false?

答案 2 :(得分:0)

查找这两个标记:

这些对应于众所周知的技术,如选项1和选项4.有些情况下,其中一个或另一个是最好的。标签wiki(信息)和标签下分组的问题将为您提供一些额外的帮助。

答案 3 :(得分:0)

单表继承和类表继承都很好。事实上,福勒推荐STI用于敏捷。如果你使用像Hibernate这样的好的ORM,那么差异是微不足道的。如果您使用PostgreSQL,您的空值也不会占用任何额外的空间。

话虽这么说,你应该进一步规范你的表(例如,父母的电话号应该在差异表中)。有关帮助,请参阅https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831