DDD: Aggregate root or Entity Key design, key UUID or unique number 应该由系统生成吗?

DDD: Aggregate root or Entity Key design, Should the key UUID or unique number be generated by the system?

在我的业务逻辑中,A User 可以通过 his/her 手机 phone 号码来识别。第三方验证系统确保客户的 phone 号码真实存在,系统在将 User 记录插入 table 之前检查唯一性。在我看来,PhoneNumber 已经是唯一的,因此 Id 是不必要的。

这是我目前的 User class。 PhoneNumber 当前是 User class.

中的值对象
    public class User : AggregateRoot<Guid>
    {
        public Guid Id {get; private set;}
        public PhoneNumber PhoneNumber { get; private set; }
        public Birthday Birthday { get; private set; }
        public Gender Gender { get; private set; }
        public Name Name { get; private set; }
    }

我想像下面这样改变。

public class User : AggregateRoot<string>
{
   public string PhoneNumber { get; private set; }
   public Birthday Birthday { get; private set; }
   public Gender Gender { get; private set; }
   public Name Name { get; private set; }
}

如果我在聚合根或实体中使用非 UUID Id 是否有任何缺陷?

不,您可以使用手动生成的 ID。 如果您正在使用 Entity Framework 并且不想将 PhoneNumber 名称更改为 Id,则需要使用 [Key] 属性,否则实体将无效,因为 Entity Framework 将无法识别主键.

PhoneNumber is already unique, so Id is unnecessary.

Phone号码分配变更;所以您需要仔细考虑这对您的设计的影响(您的结论可能是“在这种情况下我们将对数据进行手动更正”)。

在大多数情况下,关于“自然键”与“代理键”的争论仍然存在。

Are there any flaws if I use non-UUID Id in an Aggregate root or an Entity?

不需要UUID;您可以在适当的条件下使用整数。

一个属性可能有用的是系统中的所有对象都具有相同大小的键;您的“标识符”逻辑是通用的,您可以报告有关标识符的事情,而无需事先知道正在识别哪种东西。使用 UUID 可以做到这一点。

UUID 的另一个有趣 属性 是我们有从数据计算 UUID 的标准方法(参见“命名 UUID”);所以你可能会获取一些业务数据 - 比如 phone 数字 - 生成相应的 UUID,然后使用 that 作为标识符(这给你相同 - 所有的 UUID - 但是没有解决“如果 phone 数字发生变化怎么办?”问题。

PhoneNumber is already unique, so Id is unnecessary.

除了唯一性之外,还有另一个非常重要的考虑因素:phone number is PII。如果您的软件可能在美国、欧盟和世界上大多数国家/地区使用,则不能将其用作标识符,因为遵守隐私法规非常困难。例如,您无法记录它(这将无法解决问题)并且您需要能够在用户请求删除她的数据时随时删除它,这在您需要保持数据完整性时可能非常棘手数据库(大多数情况下,您可以删除个人身份信息而不删除数据库中的实际记录,但如果您的主键是个人身份信息,您就会遇到问题)。