我有一个用户表,用于存储两类用户的详细信息,即学生和教师。学生和教师共有10个字段,如用户名,密码等。如果有任何数据,则没有1到n的关系。
如果是学生,我必须存储20个不同的1对1数据,如体重,DOB,入场号,家长,电话号码等。
如果是教师,我必须存储一组二十一对一的数据,如电子邮件ID,联系号码等,这与学生无关。
从下面我可以在这种情况下使用的最佳数据库结构是什么?如果有更好的选择,请提供。
一个包含50列的表,其中20列在学生的情况下为NULL,在教师的情况下为20列将为NULL
一个包含30列的表格,其中前10列存储公共数据,接下来的20列存储学生详细信息,以防学生和教师的数据用于教师。
两个表格,其中10列用于存储用户详细信息。另有一个包含20列的表格,用于存储学生详细信息,以及学生和教师的数据,以及教师的情况。
三个表格,其中10列用于存储用户详细信息。另一个包含20列的表格用于存储学生详细信息,另一个表格包含20列用于存储教师数据
答案 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)
查找这两个标记:single-table-inheritance class-table-inheritance
这些对应于众所周知的技术,如选项1和选项4.有些情况下,其中一个或另一个是最好的。标签wiki(信息)和标签下分组的问题将为您提供一些额外的帮助。
答案 3 :(得分:0)
单表继承和类表继承都很好。事实上,福勒推荐STI用于敏捷。如果你使用像Hibernate这样的好的ORM,那么差异是微不足道的。如果您使用PostgreSQL,您的空值也不会占用任何额外的空间。
话虽这么说,你应该进一步规范你的表(例如,父母的电话号应该在差异表中)。有关帮助,请参阅https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831