加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql – 在相关数据库中维护子类完备性

发布时间:2021-01-24 23:09:15 所属栏目:编程 来源:网络整理
导读:假设我有一张表代表超等班的门生.然后我有N个表格代表该工具的子类(运带动,音乐家等).怎样表达束缚,使门生必需在一个(不多于,不少于)子类中建模? 有关评述的澄清: 这是手动维护,而不是通过ORM包. 这涉及的项目位于SQL Server之上(可是看到通用办理方案会很

假设我有一张表代表超等班的门生.然后我有N个表格代表该工具的子类(运带动,音乐家等).怎样表达束缚,使门生必需在一个(不多于,不少于)子类中建模?

有关评述的澄清:

>这是手动维护,而不是通过ORM包.
>这涉及的项目位于SQL Server之上(可是看到通用办理方案会很兴奋)
>这也许不是最好的例子.关于子类化我们可以思量几种环境,我方才发现了这个门生/运带动的例子.

A)以真正的面向工具的方法,超类可以本身存在,不必要在任何子类中建模.

B)在实际糊口中,任何工具或门生都可以有多个脚色.

C)我试图声名的特定场景要求每个工具只在一个子类中实现.可以将超类视为一个抽象实现,可能只思量其他差异的工具类/实例中的共性.

感激各人的投入,出格是比尔.

办理要领

这里有几种也许性.一个是每个表中的CHECK,个中student_id没有呈此刻任何其他姐妹子范例表中.这也许很昂贵,每次必要新的子范例时,都必要修改全部现有表中的束缚.
CREATE TABLE athletes (
  student_id INT NOT NULL PRIMARY KEY,FOREIGN KEY (student_id) REFERENCES students(student_id),CHECK (student_id NOT IN (SELECT student_id FROM musicians 
                      UNION SELECT student_id FROM slackers 
                      UNION ...)) 
);

编辑:@JackPDouglas正确地指出Microsoft SQL Server不支持上述情势的CHECK束缚.究竟上,按照SQL-99尺度,引用另一个表也是有用的(见http://kb.askmonty.org/v/constraint_type-check-constraint).

SQL-99为多表束缚界说元数据工具.这称为ASSERTION,但我不知道任何实现断言的RDBMS.

也许更好的要领是使student表中的主键成为复合主键,第二列暗示子范例.然后将每个子表中的该列限定为与表所暗示的子范例对应的单个值.编辑:不必要将PK作为子表中的复合键.

CREATE TABLE athletes (
  student_id INT NOT NULL PRIMARY KEY,student_type CHAR(4) NOT NULL CHECK (student_type = 'ATHL'),FOREIGN KEY (student_id,student_type) REFERENCES students(student_id,student_type)
);

虽然,student_type可以很轻易地成为整数,我只是将它表现为char用于声名目标.

假如您不支持CHECK束缚(譬喻MySQL),那么您可以在触发器中执行相同的操纵.

我阅读了关于确保超类表中每一行的某些子类表中存在一行的后续操纵.我以为有一种适用的要领可以用SQL元数据和束缚来做到这一点.我提议满意此要求的独一选择是行使Single-Table Inheritance.不然,您必要依靠应用措施代码来逼迫执行它.

编辑:JackPDouglas还提议行使基于Class Table Inheritance的计划.拜见his example或相同技能here或here或here的示例.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读