Database design 使用自然键作为DomainObject或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,其中它作

我已经阅读了很多关于DDD的文章,并注意到大多数在持久化到数据库时都使用GUID作为ID。他们说GUID的可伸缩性很好,当涉及到可伸缩性时,自动递增ID是一个很大的禁忌

我现在不知道是使用
GUID
还是
auto increment

基本上,这个领域是关于
成员系统(二叉树)。(跟踪注册会员)

第一个要求是,我们应该在系统中具有唯一标识他们的东西(我们称之为
账号
),可能是7位数字

然后新的
成员
可以由另一个
成员
注册。我们称之为转介

现在我计划做的是将GUID类型的
MemberId
作为域对象Id,其中它作为主键,将用于连接、外键(在引用时,referer\u Id将是GUID
MemberId
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设计并不简单,而且有很多方面。我可以推荐沃恩·弗农(Vaughn Vernon)的《实施DDD》一书,书中有一节专门介绍身份设计(第5章“实体”-独特身份)

      不管怎样,我试着给你指出正确的方向,而不是背诵那一章的所有内容:-)

      你需要什么? 您已经说明了一些关于ID设计的问题,但是还有更多的问题需要问。只有这样,您才能决定GUID、DB生成还是仍然不同的ID是合适的

      • ID的域意义是什么?可能ID只是为了方便技术解决方案,但根本不是域的一部分
      • 谁提供身份证?这可能是用户、应用程序、数据库,甚至是另一个有界上下文
      • 你什么时候需要身份证?在创建关联实体之前,在创建时,还是仅在实体被持久化时
      这些问题的答案将限制您可以使用的ID生成类型

      你应该注意什么 关于ID设计有一些规则。强烈建议您遵循以下步骤,以免以后射中自己的脚:

      • 确保您的ID是唯一的。对于用户提供的ID,这可能特别令人担忧。您需要强制执行唯一性,并为用户提供检测现有ID的可能性。对于应用程序生成的随机ID或DB生成的ID,这通常不是问题
      • 确保你的身份证是稳定的。永远不要更改实体的ID!毕竟,ID是用来引用实体的。这样做的结果是,你不应该让事情成为你ID的一部分,这可能会改变。例如,一个人的姓氏可能不是一个好的选择,因为当一个人结婚时,姓氏可能会发生变化(而且由于非唯一性,姓氏也可能有问题)
      • 隐藏ID,如果它们只是一个技术概念。从DDD的角度来看,将技术概念作为领域模型的一部分是错误的
      例子 以下是如何找到ID设计的示例:

      允许延迟创建ID(即通过持久性)意味着您在创建实体时确实有一个没有ID的实体。因此,如果您需要早期或即时ID,则不能使用DB生成的ID(除非您接受仅为检索ID而联系DB)

      然后您可能会决定用户对该ID不感兴趣,因此必须指定该ID会很奇怪。这就留下了应用程序生成的ID

      对于应用程序生成的ID,您需要确保ID是唯一的。这对于单实例应用程序来说是微不足道的,但一旦您使用多个应用程序实例创建负载平衡设置,问题可能会更大。这就是为什么许多人首先使用随机ID(比如guid)的原因,这样他们就不会在扩展时遇到死胡同

      如您所见,这个示例做出了许多假设。没有对错之分,但有了上述问题,你应该能够做出明智的决定

      我只想练习DDD的战术方面,学习如何做出艰难的架构决策