Architecture 在CQRS中,如何生成正确的自动编号ID?

Architecture 在CQRS中,如何生成正确的自动编号ID?,architecture,cqrs,Architecture,Cqrs,所以我最近读了一点CQR,我想知道如何为命令生成正确的自动编号标识符。如果indentifer是一个guid,您可以只执行guid.NewGuid()来生成标识,但是如何在自动编号的int表中生成一个安全唯一的新编号呢?我的第一个想法是,您可以在正在写入的表上选择max,但是如果两个用户同时尝试写入,并且都认为他们拥有下一个安全ID,会发生什么情况?在检查写入状态时,是否允许队列中的第一个写入并拒绝第二个+写入请求,并实现重试模式?让我们假设重新考虑数据库设计不是一个选项 如果不想让数据库分配下

所以我最近读了一点CQR,我想知道如何为命令生成正确的自动编号标识符。如果indentifer是一个guid,您可以只执行guid.NewGuid()来生成标识,但是如何在自动编号的int表中生成一个安全唯一的新编号呢?我的第一个想法是,您可以在正在写入的表上选择max,但是如果两个用户同时尝试写入,并且都认为他们拥有下一个安全ID,会发生什么情况?在检查写入状态时,是否允许队列中的第一个写入并拒绝第二个+写入请求,并实现重试模式?让我们假设重新考虑数据库设计不是一个选项

如果不想让数据库分配下一个ID,则必须在域模型中的某个位置执行此操作。在域模型中,约束由聚合保护。在您的情况下,唯一编号是一个约束,因此您必须使用聚合来生成唯一ID


顺便说一下,我从未遇到过为命令生成唯一ID的需要。命令从业务角度表示用例。如果您要求命令具有唯一的、连续的、无间隙的ID,则基础结构需求会泄漏到您的域中,这是一种明显的代码气味,表明设计决策不正确。

如果您不想让数据库分配下一个ID,则必须在域模型中的某个位置执行此操作。在域模型中,约束由聚合保护。在您的情况下,唯一编号是一个约束,因此您必须使用聚合来生成唯一ID


顺便说一下,我从未遇到过为命令生成唯一ID的需要。命令从业务角度表示用例。如果您要求命令具有唯一的、连续的、无间隙的ID,则基础结构需求会泄漏到您的域中,这是一种明显的代码气味,表明设计决策不正确。

请参阅本篇文章,其中描述了一种方法,您可以将未使用的ID块和已分配的ID作为标识符进行分配。这种方法有优点也有缺点


请参阅这篇文章,它描述了一种方法,在该方法中,您可以分配未使用的ID块和已分配的ID块作为标识符提供。这种方法有优点也有缺点


难道你不能仅仅依靠DB从序列/自动增量中选择下一个ID吗?如果你让数据库自动处理,而不是自己处理,会有什么附加值,那么你就没有一个ID来检查写操作的状态了。与CQR没有太多关系。还有什么模式要求你生成一个ID并在写操作中发送它,这样你的命令就只能写?你不能仅仅依靠DB从序列/自动增量中选择下一个ID吗?你自己这样做的附加值是什么而不是让数据库处理?如果让数据库自动处理,那么你没有用来检查写入操作状态的ID。与CQRS没有太多关系。还有什么模式要求你生成ID并在写入时发送它,以便你的命令是只写的?我正在开发一个有15年历史的应用程序,其中有些地方CQRS模式是有意义的。然而,这个应用程序在大多数表格上都有自动编号主键。因此,任何实现CQRS模式的模块都必须与现有数据库结构兼容。我可以自由使用CQRS模式构建模块,但不能自由影响设计的某些方面。听起来好像除非我想/能够使用自然键,否则我运气不佳,无法影响整体设计。我正在开发一款有15年历史的应用程序,其中有些地方CQRS模式是有意义的。然而,这个应用程序在大多数表格上都有自动编号主键。因此,任何实现CQRS模式的模块都必须与现有数据库结构兼容。我可以自由使用CQRS模式构建模块,但不能自由影响设计的某些方面。听起来好像除非我想/能够使用自然键,否则我运气不佳,无法影响整体设计。。