Database 像“父对象最多有两个子对象”这样的规则是否应该在数据库中复制

Database 像“父对象最多有两个子对象”这样的规则是否应该在数据库中复制,database,database-design,orm,domain-driven-design,Database,Database Design,Orm,Domain Driven Design,像父对象这样的规则最多可以有两个子对象,可以使用触发器在数据库中强制执行。但是,如果该规则已经在域层强制执行,那么复制该规则是否是一个好主意 在哪些情况下,重复此类规则是合理的?有没有其他办法避免这种重复?这不是数据完整性规则吗 谢谢通常我会将此逻辑排除在数据库层之外。在我看来,这更像是一条业务规则,应该存在于业务层中。如果这条规则改变了会发生什么?您想在哪里以及在多少个地方更新它?通常,除了通过业务层之外,不应该访问数据库,因此除了业务层之外,不在其他任何地方实现它是可以的。此外,触发器很混乱

像父对象这样的规则最多可以有两个子对象,可以使用触发器在数据库中强制执行。但是,如果该规则已经在域层强制执行,那么复制该规则是否是一个好主意

在哪些情况下,重复此类规则是合理的?有没有其他办法避免这种重复?这不是数据完整性规则吗


谢谢

通常我会将此逻辑排除在数据库层之外。在我看来,这更像是一条业务规则,应该存在于业务层中。如果这条规则改变了会发生什么?您想在哪里以及在多少个地方更新它?通常,除了通过业务层之外,不应该访问数据库,因此除了业务层之外,不在其他任何地方实现它是可以的。此外,触发器很混乱,很难维护,最重要的是,以后很难调试


不管怎样。

通常我会将此逻辑排除在数据库层之外。在我看来,这更像是一条业务规则,应该存在于业务层中。如果这条规则改变了会发生什么?您想在哪里以及在多少个地方更新它?通常,除了通过业务层之外,不应该访问数据库,因此除了业务层之外,不在其他任何地方实现它是可以的。此外,触发器很混乱,很难维护,最重要的是,以后很难调试


无论如何,IMHO。

IMHO触发器通常是一件“坏事”,但除此之外,在数据库表的插入级别强制执行业务规则对我来说并不是一件好的“关注点分离”

IMHO触发器通常是一件“坏事”,但除此之外,在数据库表的插入级别强制执行业务规则对我来说并不是一种很好的“关注点分离”

我会尽量避免将这种类型的“业务验证逻辑”放在数据库层中。随着应用程序的成熟,最终您将需要比触发器提供的更多的数据控制和处理


如果您的应用程序有一个业务层,我将只使用SQL强制关系,而不使用规则。

我将尽量避免在数据库层中使用这种类型的“业务验证逻辑”。随着应用程序的成熟,最终您将需要比触发器提供的更多的数据控制和处理


如果您的应用程序有一个业务层,我将只使用SQL强制关系,而不使用规则。

我认为系统的每一层都应该强制执行最大数量的约束,这些约束是系统设计为可以轻松处理的。剩下的就交给别人处理。我认为数据库约束和JavaScript约束在某种程度上是相同的;你在保持合理清洁的同时,尽你所能利用现有手段


触发器远远超出我认为合理的范围,所以我会让业务逻辑处理这个问题。有许多数据完整性规则远远超出了SQL数据库所能处理的范围。

我认为系统的每一层都应该强制执行最大数量的约束,而这些约束是系统设计为可以轻松处理的。剩下的就交给别人处理。我认为数据库约束和JavaScript约束在某种程度上是相同的;你在保持合理清洁的同时,尽你所能利用现有手段


触发器远远超出我认为合理的范围,所以我会让业务逻辑处理这个问题。有许多数据完整性规则超出了SQL数据库所能处理的范围。

在数据库之外的代码中几乎不可能正确处理这些规则。任何查看是否已有2条记录的代码,如果不存在,则允许添加新记录,都可能被同时在同一父级上运行的2个线程所愚弄。除非您实际上锁定了数据库表或以某种方式序列化了子添加过程,否则这两种情况都会造成真正的可伸缩性不足

您没有提到RDBMS,因此很难为您提供解决方案

编辑:

我同意有人说触发器远不是干净的。但它们并不是在数据库中强制执行规则的唯一方法。这就是为什么我说在不了解您的RDBMS的情况下,不可能推荐任何数据库解决方案,甚至不需要触发器的解决方案


此外,您不需要触发器,因为中间层从不使用DML,它只调用封装CRUD的数据库过程或包。对吧

在数据库之外的代码中几乎不可能正确执行此操作。任何查看是否已有2条记录的代码,如果不存在,则允许添加新记录,都可能被同时在同一父级上运行的2个线程所愚弄。除非您实际锁定了数据库表或以某种方式序列化了子添加进程,否则这两个进程都会创建 真正缺乏可伸缩性

您没有提到RDBMS,因此很难为您提供解决方案

编辑:

我同意有人说触发器远不是干净的。但它们并不是在数据库中强制执行规则的唯一方法。这就是为什么我说在不了解您的RDBMS的情况下,不可能推荐任何数据库解决方案,甚至不需要触发器的解决方案

此外,您不需要触发器,因为中间层从不使用DML,它只调用封装CRUD的数据库过程或包。对吧

视情况而定

如果对数据库的所有写入都是由单个应用程序或服务完成的,那么在应用程序/服务的业务层中实现此类业务规则是合理的。特别是如果你认为规则将来可能会改变

但在许多实际场景中,尤其是在遗留系统中,您可能有多个编写器,在数据库中实现此类规则的额外复杂性可能值得

所有的设计都是折衷的。

这要看情况而定

如果对数据库的所有写入都是由单个应用程序或服务完成的,那么在应用程序/服务的业务层中实现此类业务规则是合理的。特别是如果你认为规则将来可能会改变

但在许多实际场景中,尤其是在遗留系统中,您可能有多个编写器,在数据库中实现此类规则的额外复杂性可能值得


所有的设计都是折衷的。

我需要将其保存在触发器的数据库中。这是因为数据库可能会受到GUI以外的影响,而这种性质的规则如果不在数据库级别强制执行,则会导致数据完整性问题

我需要将其保存在触发器的数据库中。这是因为数据库可能会受到GUI以外的影响,而这种性质的规则如果不在数据库级别强制执行,则会导致数据完整性问题