当某些列仅在某些情况下适用时,为 1 对 1 关系设计数据库
Design database for 1 to 1 relationship when some columns are applicable only in certain cases
我有一个用户 table,它存储了两类用户的详细信息,即学生和教师。学生和老师共有10个字段,例如用户名,密码等。这里的任何数据都没有1对n的关系。
如果是学生,我必须存储 20 个不同的 1 对 1 数据,例如体重、出生日期、入学编号、家长、Phone 号码等。
如果是教师,我必须单独存储一组 20 个一对一的数据,例如电子邮件 ID、单位编号等,这些数据与学生没有任何关系。
在下面的这种情况下,我可以使用的最佳数据库结构是什么?如果有更好的选择也请提供。
一个 table 有 50 列,其中 20 列对于学生为 NULL,20 列对于教师为 NULL
一个 table 有 30 列,其中前 10 列存储公共数据,接下来的 20 列存储学生详细信息(如果是学生)和教师数据(如果是教师)。
两个 table,其中一个有 10 列,用于存储用户详细信息。另一个 table 有 20 列,用于存储学生的详细信息(如果是学生)和教师的数据(如果是教师)。
三个 table 一个有 10 列来存储用户详细信息。另一个 table 有 20 列用于存储学生的详细信息,另一个 table 有 20 列用于存储教师的数据
你要记住关系设计的原则。所有列都应该依赖于关键字段,并且只依赖于关键字段。
最好选择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.
没有多余的空列,而且查询类型非常灵活(其中一些您没有预料到)。
我首先想到的是猪耳朵关系,一个 link 实体,这样你就可以有 ID、teacherID、studentID 来显示哪些老师教哪些学生,但后来我意识到这不是你问的是什么...
为什么不只有一个布尔值,如果是老师则为真,否则为假?
查找这两个标签:single-table-inheritance class-table-inheritance
这些对应于众所周知的技术,例如选项 1 和选项 4。在某些情况下,其中一个或另一个是最好的。标签 wikis (info) 和标签下分组的问题会给你一些额外的帮助。
单Table继承和ClassTable继承都可以。事实上,Fowler 已经为敏捷推荐了 STI。如果你使用像 Hibernate 这样的好 ORM,区别就很小了。如果您使用 PostgreSQL,您的空值也不会占用任何额外的 space。
也就是说,您应该进一步规范化您的 tables(例如,parents phone #s 应该在 diff table 中)。请参阅 https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831 寻求帮助
我有一个用户 table,它存储了两类用户的详细信息,即学生和教师。学生和老师共有10个字段,例如用户名,密码等。这里的任何数据都没有1对n的关系。
如果是学生,我必须存储 20 个不同的 1 对 1 数据,例如体重、出生日期、入学编号、家长、Phone 号码等。
如果是教师,我必须单独存储一组 20 个一对一的数据,例如电子邮件 ID、单位编号等,这些数据与学生没有任何关系。
在下面的这种情况下,我可以使用的最佳数据库结构是什么?如果有更好的选择也请提供。
一个 table 有 50 列,其中 20 列对于学生为 NULL,20 列对于教师为 NULL
一个 table 有 30 列,其中前 10 列存储公共数据,接下来的 20 列存储学生详细信息(如果是学生)和教师数据(如果是教师)。
两个 table,其中一个有 10 列,用于存储用户详细信息。另一个 table 有 20 列,用于存储学生的详细信息(如果是学生)和教师的数据(如果是教师)。
三个 table 一个有 10 列来存储用户详细信息。另一个 table 有 20 列用于存储学生的详细信息,另一个 table 有 20 列用于存储教师的数据
你要记住关系设计的原则。所有列都应该依赖于关键字段,并且只依赖于关键字段。
最好选择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.
没有多余的空列,而且查询类型非常灵活(其中一些您没有预料到)。
我首先想到的是猪耳朵关系,一个 link 实体,这样你就可以有 ID、teacherID、studentID 来显示哪些老师教哪些学生,但后来我意识到这不是你问的是什么...
为什么不只有一个布尔值,如果是老师则为真,否则为假?
查找这两个标签:single-table-inheritance class-table-inheritance
这些对应于众所周知的技术,例如选项 1 和选项 4。在某些情况下,其中一个或另一个是最好的。标签 wikis (info) 和标签下分组的问题会给你一些额外的帮助。
单Table继承和ClassTable继承都可以。事实上,Fowler 已经为敏捷推荐了 STI。如果你使用像 Hibernate 这样的好 ORM,区别就很小了。如果您使用 PostgreSQL,您的空值也不会占用任何额外的 space。
也就是说,您应该进一步规范化您的 tables(例如,parents phone #s 应该在 diff table 中)。请参阅 https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831 寻求帮助