Sql 约束代替触发器(具体问题)

Sql 约束代替触发器(具体问题),sql,database,database-design,triggers,constraints,Sql,Database,Database Design,Triggers,Constraints,我在这里读到了使用约束而不是触发器的一些原因。但我有一个疑问。如何确保(仅使用约束)超类表和子类表之间的一致性 使用触发器只需在登录时进行检查。。UPD 有没有办法只使用约束来定义这种关系(我是新手),谢谢 数据库是关系型的,约束可以很好地强制执行关系依赖关系,这样做已经有30多年了。你说的超级班和次级班是什么 更新 在数据库中引入OO继承关系实际上是很有问题的。以你为例,合同雇员和全职雇员。您可以将其建模为1)带有鉴别器字段的单个表,2)两个不相关的表,或3)三个表(一个包含公共部分,一个包含

我在这里读到了使用约束而不是触发器的一些原因。但我有一个疑问。如何确保(仅使用约束)超类表和子类表之间的一致性

使用触发器只需在登录时进行检查。。UPD


有没有办法只使用约束来定义这种关系(我是新手),谢谢

数据库是关系型的,约束可以很好地强制执行关系依赖关系,这样做已经有30多年了。你说的超级班和次级班是什么

更新

在数据库中引入OO继承关系实际上是很有问题的。以你为例,合同雇员和全职雇员。您可以将其建模为1)带有鉴别器字段的单个表,2)两个不相关的表,或3)三个表(一个包含公共部分,一个包含合同特定信息,一个包含全职特定信息)

但是,如果从传统范式的角度来处理相同的问题,最终可能会得到类似于1)或3)的结构,但绝不是2)的结构。通常情况下,您最终会得到一些您从OO设计板上推荐的东西


问题是,当这种需求冲突发生时,今天几乎总是OO设计占上风。通常情况下,关系模型甚至不会出现在桌面上。我之所以认为这是一个“问题”,是因为大多数情况下,数据库的寿命远远超过其原始应用程序。我经常看到一些设计可以追溯到一个早已被遗忘的应用程序的OO域驱动设计会话,人们可以在数据库模式中看到,随着时间的推移,OO设计被“敲打”到位,以适应底层关系引擎可以支持、扩展和交付的内容。对我来说,tell符号是在一个围绕标识ID的聚集索引上组织的表,而从来没有人询问这些表的特定ID。

数据库是关系型的,约束很好地强制执行关系依赖关系,这种做法已经有30多年了。你说的超级班和次级班是什么

更新

在数据库中引入OO继承关系实际上是很有问题的。以你为例,合同雇员和全职雇员。您可以将其建模为1)带有鉴别器字段的单个表,2)两个不相关的表,或3)三个表(一个包含公共部分,一个包含合同特定信息,一个包含全职特定信息)

但是,如果从传统范式的角度来处理相同的问题,最终可能会得到类似于1)或3)的结构,但绝不是2)的结构。通常情况下,您最终会得到一些您从OO设计板上推荐的东西


问题是,当这种需求冲突发生时,今天几乎总是OO设计占上风。通常情况下,关系模型甚至不会出现在桌面上。我之所以认为这是一个“问题”,是因为大多数情况下,数据库的寿命远远超过其原始应用程序。我经常看到一些设计可以追溯到一个早已被遗忘的应用程序的OO域驱动设计会话,人们可以在数据库模式中看到,随着时间的推移,OO设计被“敲打”到位,以适应底层关系引擎可以支持、扩展和交付的内容。对于我来说,tell标志是在没有人询问表中的特定ID时,在围绕标识ID的聚集索引上组织的表。

您可以使用约束来确保每个ContractEmployees行都有相应的Employees行,对于SalariedEmployees也是如此。我不知道如何使用约束来强制执行相反的操作:确保每个员工行中,ContractEmployees或SalariedEmployees中都有一行

备份一点。。。在关系数据库中建模OO继承有三种主要方法。术语来源于Martin Fowler的企业应用程序架构模式:

  • 单表继承:所有内容都在一个大表中,有许多只适用于某些子类的可选列。容易做,但不是很优雅

  • 混凝土表继承:每个混凝土类型一个表。因此,如果所有员工都是有薪员工或合同员工,那么您将有两个表:有薪员工和合同员工。我也不喜欢这种方法,因为它使查询所有员工变得更加困难,不管他们是什么类型的

  • 类表继承:基类一个表,每个子类一个表。所以有三张表:雇员、受薪雇员和合同雇员

  • 下面是带约束的类表继承示例(MS SQL Server代码):

    两个子类表上的“referenceemployees(ID)”部分定义了一个外键约束。这确保了“受薪员工”或“合同员工”中的每一行都必须有一行“员工”


    ID列将所有内容链接在一起。在子类表中,ID既是该表的主键,也是指向基类表的外键。

    您可以使用约束来确保每个ContractEmployees行都有相应的Employees行,对于SalariedEmployees也是如此。我不知道如何使用约束来强制执行相反的操作:确保每个员工行中,ContractEmployees或SalariedEmployees中都有一行

    备份一点。。。在关系数据库中建模OO继承有三种主要方法。术语来源于Martin Fowler的企业应用程序架构模式:

  • 单表继承:所有内容都在一个大表中,有许多只适用于某些子类的可选列。容易做,但不是很优雅

  • 混凝土
    CREATE TABLE Employees 
    (
      ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
      FirstName VARCHAR(100) NOT NULL DEFAULT '',
      LastName VARCHAR(100) NOT NULL DEFAULT ''
    );
    
    CREATE TABLE SalariedEmployees
    (
      ID INT NOT NULL PRIMARY KEY REFERENCES Employees(ID),
      Salary DECIMAL(12,2) NOT NULL
    );
    
    CREATE TABLE ContractEmployees
    (
      ID INT NOT NULL PRIMARY KEY REFERENCES Employees(ID),
      HourlyRate DECIMAL(12,2) NOT NULL
    );
    
    EMPLOYEE_TYPE_CODE     DESCRIPTION
    -----------------------------------
    CONTRACT               Contractor
    SALARY                 Salaried
    WAGE_SLAVE             I can't be fired - slaves are sold