在域驱动设计中,guid作为身份领域更好吗?

Lie*_*oen 4 int domain-driven-design guid identity-column

使用guids作为标识字段而不是自动递增整数时,是否更容易实现域驱动设计?使用guids,您无需跳转到数据库即可获得实际值.

Vij*_*tel 6

DDD的核心原则之一是持久性无知.所以,是的,GUID是为对象提供唯一标识而不必依赖持久性存储的最简单方法.

注意:如果您担心使用GUID的数据库性能,请考虑使用COMB(特别是SQL Server索引碎片)


mar*_*c_s 5

好吧,GUID很简单,看起来最合适.他们很想吸引程序员,因为他们不必处理数据库.

另一方面,当看到他们使用时可能存在的潜在缺点而不考虑数据库问题太多时,我会尽可能地警告他们.

问题实际上是:在将数据存储在数据库之前,您是否真的需要知道实体的ID?真?为什么?

如果你决定最后使用GUID,如果你使用SQL Server作为你的数据库后端(我不太了解其他RDBMS提出明智的建议),我强烈建议你绝对确定GUID 用作表上的群集键.毫无疑问,这会扼杀你的表现.

如果您确实使用GUID作为主键,请确保使用其他东西,其他一些对数据库造成较小破坏的列作为您的群集密钥 - 而INT IDENTITY将是我的首选.

查看Kimberly Tripp关于为什么GUID 作为SQL Server数据库中的集群密钥绝对不是一个好主意的这些文章- 她是索引编制索引和性能问题的终极大师,她可以使这些点比我曾经能够:

  • 我不认为这是关于"在存储之前知道ID",因为域应该是设置ID的域,因为实体的标识符应该是域关注点.PK是数据库的实现细节,域名对此一无所知.一个ID就像一个递增的整数,很像数据库中的一个标识,这是一个巧合.我认为这两个概念需要在DDD中保持独立 (2认同)
  • 如果在同一事务中发布事件消息,则可能需要引用聚合根的身份。 (2认同)