Sql 如何在数据库中实现完全不相交的专门化?
假设有一个面向学生和教授的数据库(非常简单),关系数据库如下所示:Sql 如何在数据库中实现完全不相交的专门化?,sql,database,relational-database,Sql,Database,Relational Database,假设有一个面向学生和教授的数据库(非常简单),关系数据库如下所示: GradStudent (_id_, name, gradStuff) UndergradStudent (_id_, name, underGradStuff) Professor (_id_, name) Teaches(_prof_id_, _stud_id_) 考虑到上面的关系数据库表示完全不相交的专门化,即没有表Student,而是两个完全独立的表,在用SQL编写此表以实现数据库时,如何获取teachs表的学生id?
GradStudent (_id_, name, gradStuff)
UndergradStudent (_id_, name, underGradStuff)
Professor (_id_, name)
Teaches(_prof_id_, _stud_id_)
考虑到上面的关系数据库表示完全不相交的专门化,即没有表Student
,而是两个完全独立的表,在用SQL编写此表以实现数据库时,如何获取teachs
表的学生id?
我不知道如何从两个不同的表中生成外键
我写这个问题的前提是,SQL语言在所有平台上并不完全不同。如果需要澄清:我正在从事Oracle SQL开发人员的工作
编辑::其他信息/澄清:
对于我试图实现的目标,要获得更直观、更简单的观点:
我想用SQL代码编写以下内容(但我不知道如何实现,因此不知道如何实现)
如果图片过于简单,我深表歉意,如果需要,我可以添加更多属性和细节,请告诉我。如果通过“获取教师表的学生id”,您的意思是您希望教师。学生id是引用“研究生或本科生视情况而定”的FK,您不能。FK的目标必须是不是视图的表的键。你没有这样的表,因此你也没有这样的键 我看到的唯一方法是编写一个触发器,该触发器在插入/更新到内存时进行检查 我不知道如何从两个不同的表中生成外键 您的意思是,一个外键指向/引用两个不同的表。但是在这个设计中没有这样的外键 我们为一个表声明一个SQL外键,表示(即告诉DBMS)列列表的值也是表(可能是同一个表)中唯一的对应列列表(可能是同一个列表)的值。这里没有这个。您的表上有不同的约束 如果您确实需要这些基表,那么必须在SQL中使用触发器来强制执行约束 您还可以拥有具有以下功能的设计:
- 具有非NULL唯一或主键id的基表学生
- 研究生(id)、本科生(id)和教师(stud_id)的外键参考学生(id)
- 学生在id上的投影是研究生和本科生在id上投影的不相交并集的约束
- 类型鉴别器/标记列
(假设)在研究生、本科生和学生中,具有来自研究生和本科生的附加外键(超级键)(id,student\u type),在学生中不为空唯一(id,student\u type)student\u type
- 研究生考试(学生类型=‘研究生’)和本科生考试(学生类型=‘本科生’)
有关子类型化习语的更多信息,请参阅。Google“stackoverflow数据库sql表”加上子/父、超级/子表、超级/子类型、继承和/或多态性。还有多个/多个/两个FK/关系/关联/引用/链接(尽管通常在本问题中,所需约束不是FK,设计应使用子类型)。我在谷歌上搜索了“stackoverflow two foreign keys”(两个外键),得到了。你需要有两个id字段,一个用于grad,另一个用于本科生,其中一个需要设置为NULL,我们可以使用check约束来满足条件。您知道是否有方法实现
学生
表,并且仍然保持完全不相交的专业化(即,数据库中没有既不是本科也不是研究生的学生)?我不太熟悉约束条件,因此我要问,“获取教师表的学生id”并没有说明您想要表达的内容。对此表示抱歉。我加了一张图片来澄清。希望有帮助。请用你想说的话来代替这些废话。此外,您的图表还添加了学生,但您的问题并没有表明您愿意拥有它,甚至说“没有学生表”。此外,我们只能猜测,一行接一行的“总计”是不可理解的。请努力用语言清楚地表达自己。这确实需要努力。不要希望,行动吧。我想我在寻找的是你刚才解释的替代方案。谢谢!是的,我也发现了那篇文章,但他们只涉及理论,而不是实际的数据库制作。也就是说,除非我跳过了某些事情,有时我会这样做。编辑:没关系,他们做了,我只是跳过了很多,因为一开始这个问题看起来很混乱。很抱歉。再次感谢!此外,如果将学生类型
设置为唯一,是否允许学生
表中有2条以上的记录?学生类型在任何表中都不是唯一的;表中的许多学生/行可以具有相同的学生类型。但我不明白你的问题:如果它在哪一个表格中是独一无二的?为什么您认为学生表中不能超过2行?可能有。但给定(id,student_type)值的行不能超过两行。霍维夫