Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在数据库中实现完全不相交的专门化?_Sql_Database_Relational Database - Fatal编程技术网

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上投影的不相交并集的约束
您可以通过触发器来表示后一个约束。表达不相交(但不是并集)的无触发方式是:

  • 类型鉴别器/标记列
    student\u type
    (假设)在研究生、本科生和学生中,具有来自研究生和本科生的附加外键(超级键)(id,student\u type),在学生中不为空唯一(id,student\u type)
  • 研究生考试(学生类型=‘研究生’)和本科生考试(学生类型=‘本科生’)
两个student子类型基表中的每一个表中的行都是相同的(冗余),student中的行由它们的id(冗余)确定,但这是在没有触发器的情况下的成本。列student\u类型可以是计算列

实际上,没有一种漂亮的SQL方法来强制每个父id都是子id。只有上述子表的左联接而不是父表和子表,强制每个父表都是子表,但需要空列和进一步的约束。我们需要触发器来合理地约束SQL数据库。我们可以使用习惯用法来获取所能得到的声明性约束


有关子类型化习语的更多信息,请参阅。Google“stackoverflow数据库sql表”加上子/父、超级/子表、超级/子类型、继承和/或多态性。还有多个/多个/两个FK/关系/关联/引用/链接(尽管通常在本问题中,所需约束不是FK,设计应使用子类型)。我在谷歌上搜索了“stackoverflow two foreign keys”(两个外键),得到了。

你需要有两个id字段,一个用于grad,另一个用于本科生,其中一个需要设置为NULL,我们可以使用check约束来满足条件。您知道是否有方法实现
学生
表,并且仍然保持完全不相交的专业化(即,数据库中没有既不是本科也不是研究生的学生)?我不太熟悉约束条件,因此我要问,“获取教师表的学生id”并没有说明您想要表达的内容。对此表示抱歉。我加了一张图片来澄清。希望有帮助。请用你想说的话来代替这些废话。此外,您的图表还添加了学生,但您的问题并没有表明您愿意拥有它,甚至说“没有学生表”。此外,我们只能猜测,一行接一行的“总计”是不可理解的。请努力用语言清楚地表达自己。这确实需要努力。不要希望,行动吧。我想我在寻找的是你刚才解释的替代方案。谢谢!是的,我也发现了那篇文章,但他们只涉及理论,而不是实际的数据库制作。也就是说,除非我跳过了某些事情,有时我会这样做。编辑:没关系,他们做了,我只是跳过了很多,因为一开始这个问题看起来很混乱。很抱歉。再次感谢!此外,如果将
学生类型
设置为唯一,是否允许
学生
表中有2条以上的记录?学生类型在任何表中都不是唯一的;表中的许多学生/行可以具有相同的学生类型。但我不明白你的问题:如果它在哪一个表格中是独一无二的?为什么您认为学生表中不能超过2行?可能有。但给定(id,student_type)值的行不能超过两行。霍维夫