2009-11-21 151 views
2

使用guid作为标识字段而不是自动递增整数时,实现域驱动设计更容易吗?使用guid,您不必跳到数据库即可获取实际值。在领域驱动设计中,身份领域更好吗?

+0

实体的标识符及其在数据库中的主键是互斥概念IMO。 PK是一个实现细节;该域不应该具有对持久层的依赖或知识。如果你接受这一点,那么选择答案中的一个点更有意义。实体标识符可以是由域设置的guid,而PK可以是自动递增的int。 – Sinaesthetic 2016-03-31 09:52:20

+0

在从域中抽象持久化实现方面,问问自己:如果要将数据库切换到平面文件存储,您是否还能从平面文件获取ID?如果你的答案是否定的,那么你可以看到为什么你不应该使用它。通过允许域设置实体的标识符(在本例中是一个GUID),您可以为域保留该概念。允许数据库也生成一个可以索引的PK(本例中是一个int);这又是一个实现细节。 – Sinaesthetic 2016-04-03 07:04:02

回答

4

好,GUID是容易,看起来像最合适的。他们很喜欢前程序员,因为他们不必处理数据库。另一方面,当我们在使用数据库时不考虑数据库问题的潜在缺点时,我会尽可能地提醒他们。

问题的确是:你真的需要在存储在数据库之前知道实体的ID吗?真? 为什么?

如果你决定去与最终的GUID,如果你使用SQL Server作为后端数据库(我不知道有足够的了解其他RDBMS做出明智的建议),我会强烈建议您绝对确保GUID是而不是被用作表上的集群密钥。这会扼杀你的表现 - 毫无疑问。

如果确实使用GUID作为主键,请确保使用别的东西,其他一些列对数据库造成的破坏不会很大,因为您的集群键 - INT IDENTITY是我的第一选择。

退房由金佰利特里普这些文章为什么一个GUID绝对是一个好主意,因为在SQL Server数据库中的聚集键 - 她是最终的大师,当谈到索引和性能问题的索引和她能使得这些点好多比我以往任何时候都可以:

Marc

+1

我并不认为“在存储ID之前知道ID”这么多,因为域应该是设置ID的域,因为实体的标识符应该是一个域关注的问题。 PK是数据库的实现细节,这是域名一无所知。一个与数据库中的标识非常类似的简单增量整数的ID是巧合。我认为这两个概念需要在DDD中保持独立 – Sinaesthetic 2016-04-03 06:59:57

+0

如果我在同一事务中发布事件消息,则可能需要引用聚合根的标识。 – pnschofield 2017-12-13 20:51:03

1

我推荐Guids,因为你不知道你在看什么。另外,我知道这会被当成一个笑话,但我必须调试系统中发生的一个问题,它在寻找uint而不是guid。这会导致Sharepoint中的模板被停用,导致我们无法重新激活它。花了2天时间来发现潜在的问题。所以要回顾Guid's。

1

我看到GUID在递增整数上的唯一优点是身份创建的分散。也就是说,递增整数需要原子增量和读取共享值,而GUID可以独立创建,几乎不用担心碰撞。

至于你的建议,GUID允许在不咨询数据库的情况下解引用一个实体,我不明白这是怎么回事,如果没有其他信息没有在你的问题中提到。您在这里选择的是类型之一,而不是是否使用密钥。如果您手中有密钥,并且密钥通过数据库映射到值或实体,则需要查阅数据库以解密引用密钥。

1

我使用GUID的原因有两个:

  • 的ID是唯一的,不仅在那里它被创建的上下文中,所以ID的相同类型的数据可以在不同的位置产生。如果您有多个分布在不同地理位置的互相交换数据或处于断开连接的情况下的安装情况,则这种做法很好。
  • 它反驳了以逻辑方式处理ID的冲动,而是强制开发人员将该值视为“公正和ID”。

但是,我不一定会说这些参数仅适用于域驱动设计。

5

DDD的核心原则之一是持久性无知。所以,是的,GUID是最简单的方式,无需依赖持久性存储即可为您的对象提供唯一标识

注:如果您使用的GUID很关心数据库的性能,可以考虑使用梳子(专为SQL Server索引碎片)

-1

不,绝对不是。 GUID是不应该泄漏到您的域中的实现细节。你需要一个身份值对象,我不在乎你如何实现它。

+0

我认为这是完全倒退。 guid是实现细节的极性相反; PK将是一个实现细节。在DDD中多次指出实体的标识符应该是全局唯一的标识符。是否将其用作数据库中的PK是另一回事。 – Sinaesthetic 2016-03-31 09:47:46

+0

@Sinaesthetic再好好想一想。身份可以是一个相关的领域概念,它的实现不是 – 2016-04-02 20:51:22

+0

我甚至不确定这意味着什么。标识符是领域专家想要的;无论是guid还是int或字符串都是无关紧要的。它不应该是任何将它与数据库绑定在一起的东西,比如自动递增的int,因为数据库是一个实现细节。 guid只是一个价值,而不是实现细节。 – Sinaesthetic 2016-04-03 00:56:51