使用GUID作为标识字段,相比自增整数,是否更容易实现领域驱动设计?使用GUID可以避免跳转到数据库以获取实际值。
嗯,GUID很容易,并且看起来是最合适的选择。对于前端程序员来说,它们很诱人,因为他们不必处理数据库。
另一方面,当没有考虑太多数据库问题时使用时,它们可能存在潜在缺点。因此,我会尽可能地警告您不要使用它们。
真正的问题是:在实体存储到数据库之前,您是否真的需要知道实体的ID?真的吗?为什么?
如果最终决定使用GUID,并且使用SQL Server作为您的数据库后端(我不了解其他RDBMS足以做出明智的建议),我强烈建议您确保GUID不被用作表上的聚集键。这将影响性能-毫无疑问。
如果您将GUID用作主键,请确保使用其他某些列而不是GUID作为聚集键,以减少对数据库的影响。例如,使用INT IDENTITY作为聚集键是我的首选。
请查看Kimberly Tripp撰写的这些文章,了解为什么在SQL Server数据库中,GUID绝对不是聚集键的好选择-她是索引和性能问题方面的终极专家,她可以比我更好地阐述这些观点:
Marc
领域驱动设计的核心原则之一是持久化无关性。因此,使用GUID可以为对象提供唯一标识而不必依赖于持久性存储,是最简单的方法。
注意:如果你担心使用GUID会影响数据库性能,请考虑使用COMB(特别是针对SQL Server索引碎片化的情况)。
我建议使用Guids,因为这样就没有混淆你正在查看的内容。此外,虽然这经常被拿来开玩笑,但我曾经调试过一个系统问题,它在寻找uint而不是guids。这导致了sharepoint中的一个模板被停用,并且没有办法重新激活它。花了2天时间才发现底层问题所在。所以,总之选择Guid's。
我使用guid的原因有两个:
然而,我不一定会说这些论点仅适用于领域驱动设计。