Database design 使用自然键作为DomainObject或GUID的ID+;自动增量领域驱动设计
我已经阅读了很多关于DDD的文章,并注意到大多数在持久化到数据库时都使用GUID作为ID。他们说GUID的可伸缩性很好,当涉及到可伸缩性时,自动递增ID是一个很大的禁忌 我现在不知道是使用Database design 使用自然键作为DomainObject或GUID的ID+;自动增量领域驱动设计,database-design,orm,domain-driven-design,primary-key-design,Database Design,Orm,Domain Driven Design,Primary Key Design,我已经阅读了很多关于DDD的文章,并注意到大多数在持久化到数据库时都使用GUID作为ID。他们说GUID的可伸缩性很好,当涉及到可伸缩性时,自动递增ID是一个很大的禁忌 我现在不知道是使用GUID还是auto increment 基本上,这个领域是关于成员系统(二叉树)。(跟踪注册会员) 第一个要求是,我们应该在系统中具有唯一标识他们的东西(我们称之为账号),可能是7位数字 然后新的成员可以由另一个成员注册。我们称之为转介 现在我计划做的是将GUID类型的MemberId作为域对象Id,其中它作
GUID
还是auto increment
基本上,这个领域是关于成员系统(二叉树)。(跟踪注册会员)
第一个要求是,我们应该在系统中具有唯一标识他们的东西(我们称之为账号
),可能是7位数字
然后新的成员
可以由另一个成员
注册。我们称之为转介
现在我计划做的是将GUID类型的MemberId
作为域对象Id,其中它作为主键,将用于连接、外键(在引用时,referer\u Id将是GUIDMemberId
)AccountNo
将是一个自动递增列,或者它可能由MAX()+1从存储库中获取。主要用于系统和链接中的搜索功能
DomainObject的ID是否应该对系统用户保持隐藏,因为它只是一个技术实现
两者结合可以吗?GUID作为数据库中的行id(代理项键)。和(自然关键点)的自动增量
是否可以从构造函数中排除AccountNo
,因为它将自动递增?那么强制执行不变量的必要性呢?那么,从存储库中获取下一个ID,并将AccountNo
包含在构造函数中,这是正确的做法吗
我是否应该坚持使用自动递增ID而忽略GUID,删除MemberId
,并将AccountNo
作为DomainObject的ID
注:
我不是在建立下一个facebook
我只想练习DDD的战术方面,学习如何做出艰难的体系结构决策,了解它们的优缺点
我只想练习DDD的战略方面,学习如何做出艰难的体系结构决策,了解它们的优缺点及其实现
如果我们将针对会员注册制定3个方案:
- 第一种情况:会员注册每分钟发生一次
- 第二种情况:会员注册每小时进行一次
- 第三种情况:会员注册每天发生5次
- ASP MVC 5
- Sql Server 2014
- C#
- 衣冠楚楚
- ID的域意义是什么?可能ID只是为了方便技术解决方案,但根本不是域的一部分
- 谁提供身份证?这可能是用户、应用程序、数据库,甚至是另一个有界上下文李>
- 你什么时候需要身份证?在创建关联实体之前,在创建时,还是仅在实体被持久化时
- 确保您的ID是唯一的。对于用户提供的ID,这可能特别令人担忧。您需要强制执行唯一性,并为用户提供检测现有ID的可能性。对于应用程序生成的随机ID或DB生成的ID,这通常不是问题
- 确保你的身份证是稳定的。永远不要更改实体的ID!毕竟,ID是用来引用实体的。这样做的结果是,你不应该让事情成为你ID的一部分,这可能会改变。例如,一个人的姓氏可能不是一个好的选择,因为当一个人结婚时,姓氏可能会发生变化(而且由于非唯一性,姓氏也可能有问题)
- 隐藏ID,如果它们只是一个技术概念。从DDD的角度来看,将技术概念作为领域模型的一部分是错误的李>
- 您的问题中可能有太多的问题无法给出完整的答案,因为ID设计并不简单,而且有很多方面。我可以推荐沃恩·弗农(Vaughn Vernon)的《实施DDD》一书,书中有一节专门介绍身份设计(第5章“实体”-独特身份)
不管怎样,我试着给你指出正确的方向,而不是背诵那一章的所有内容:-)
你需要什么?
您已经说明了一些关于ID设计的问题,但是还有更多的问题需要问。只有这样,您才能决定GUID、DB生成还是仍然不同的ID是合适的