Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 Design_Triggers_Foreign Keys_Constraints - Fatal编程技术网

在使用外键向数据库添加新项时,是否应使用SQL触发器在其他表中创建相关行?

在使用外键向数据库添加新项时,是否应使用SQL触发器在其他表中创建相关行?,sql,database-design,triggers,foreign-keys,constraints,Sql,Database Design,Triggers,Foreign Keys,Constraints,我正在使用SQL 2005实现一个数据库设计,其中包含一个车辆表、车辆引擎和车辆齿轮表 每个表都有一个作为SQL标识号的ID,每个发动机和档位都与车辆ID有关系。 所以,在我创造一辆汽车之前,我必须创造一个引擎和齿轮 在创建发动机和档位时,我如何知道车辆标识号?由于发动机和齿轮表的外键约束,车辆行尚未创建 我是否应该实施自动触发,在创建车辆时为链接到车辆的发动机和档位创建空行?但是,我又怎么知道车辆ID呢?每辆车是否只有一个发动机和一个档位?如果是这样的话,为什么它们在不同的表中 如果必须将它们

我正在使用SQL 2005实现一个数据库设计,其中包含一个车辆表、车辆引擎和车辆齿轮表

每个表都有一个作为SQL标识号的ID,每个发动机和档位都与车辆ID有关系。 所以,在我创造一辆汽车之前,我必须创造一个引擎和齿轮

在创建发动机和档位时,我如何知道车辆标识号?由于发动机和齿轮表的外键约束,车辆行尚未创建


我是否应该实施自动触发,在创建车辆时为链接到车辆的发动机和档位创建空行?但是,我又怎么知道车辆ID呢?

每辆车是否只有一个发动机和一个档位?如果是这样的话,为什么它们在不同的表中


如果必须将它们放在两个表中,则可以创建一个INSTEAD OF INSERT触发器,如下所述:

您确定表的设计正确吗?我真的不明白你们之间有什么样的关系。例如:您是否试图在车辆和发动机之间创建一对多或多对一关系

一个选项可以是(如果它满足您的需要):

车辆:(ID,EngineID,GearID,…)

发动机(ID,其他发动机数据)


档位(ID,其他档位数据)

如果必须有两个单独的表,可以在视图中连接它们,然后更新/插入到视图中

CREATE VIEW VehicleComplete AS SELECT * FROM Vehicle INNER JOIN VehicleEngine USING(VehicleID)

UPDATE VehicleComplete SET Rego = 'ABC 123', EngineModel = '380' WHERE VehicleID = 1

无论哪种情况,都不需要在没有数据的任何表中创建行。例如,可以使用与车辆不匹配的发动机排。您可以在找到时添加缺少的内容

我想我理解这个设计。每辆车可以有一个发动机和一个变速器。但在找到车辆之前,您可以记录变速箱或发动机

它们实际上是独立的实体,所以要这样对待它们。你可能很容易得到与汽车不匹配的发动机和变速器

另一个更有趣的问题是,你最终是否会得到一个与发动机匹配的变速箱,而不是一辆汽车。人们经常看到发动机和变速箱栓在一起而看不到车辆。它们也经常一起出售

事实上,您可以想象这三个实体中的任何一个单独存在,或者与一个或两个其他实体相匹配


触发器在这里没有作用。如果使用触发器,则应该将其限制为关于模式结构的细粒度引用完整性规则,而不是像这样的业务规则。没有强制约束-每个外键都是可选的(可为空)。设置FK字段有几种不同的方法。

我必须说,我个人认为这种情况没有意义,真的

为了让齿轮或发动机存在,你需要一辆车。您的业务规则/域模型应该真正实现这一点,外键关系只是验证这种情况的一种方法


或者,最好将发动机与车辆之间的关系视为多个关系。为此,您需要一个附加表来链接车辆和发动机。这意味着您可以有外键约束,但也意味着一个引擎可以链接到许多汽车,反之亦然。这更真实地模拟了现实世界,在现实世界中,许多车型都使用相同的发动机,一辆车可能有多种发动机可供选择。

任何持久性框架都可以解决这类问题。在典型的O/R映射器场景中,您只需创建所需的实体(例如间接创建),O/R映射器就会以正确的顺序保存实体,并自动同步FK/PK字段

如果你在与这些问题作斗争,你真的会因为已经为你解决的问题而损失时间(从而损失金钱),你不能把时间花在为客户解决问题上。所以,帮你自己和你的客户一个忙,至少看看外面的一些持久性框架

(免责声明:我是o/r映射器框架的首席开发人员)

但是我又怎么知道那辆车呢 身份证


在insert触发器中有一个名为的表。您将在此处找到车辆ID。

如果您确实无法在不同时刻创建每个实体,则应在事务中创建它们,并明确显示创建每个实体的必要步骤

触发器解决方案是最难实现的,因为它“隐藏”在curtins重要的业务规则后面

嗯。。。。在这两种情况下,您都应该查看您的问题定义,因为这类问题通常来自于糟糕的业务领域定义


底线:您的每一个触发器都将是下一个项目执行的另一个难题。

表之间存在外键关系并不意味着您必须按特定顺序创建数据。通常,人们希望先创建车辆记录,然后再为其分配发动机和档位,但情况并非如此

如果在您的场景中,在分配给车辆之前,发动机或档位有可能记录在数据库中,则您需要使引用车辆ID的FK列允许为空。一旦创建了车辆行,这些信息就可以链接到车辆id


或者,您可以创建您的车辆记录,然后在创建发动机和档位记录时为其分配发动机和档位记录。

谢谢您的回答

其实我的意思是: 车辆:(ID,其他车辆数据,…) 发动机(ID、车辆ID、其他发动机数据) 档位(ID、车辆ID、其他档位数据)

因此,每辆车可以有多个发动机和齿轮…(是的