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