当前位置: 首页 > 知识库问答 >
问题:

DDD:聚合根或实体密钥设计,密钥UUID或唯一编号是否应由系统生成?

颜楚青
2023-03-14

在我的业务逻辑中,用户可以通过他/她的手机号码来识别。第三方验证系统确保客户的电话号码真实存在,并在将用户记录插入表格之前检查唯一性。在我看来,PhoneNumber已经是唯一的,所以Id是不必要的。

这是我当前的用户课程PhoneNumber当前是User类中的值对象

    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,是否存在任何缺陷?

共有3个答案

巢承安
2023-03-14

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

轩辕实
2023-03-14

PhoneNumber已经是唯一的,所以Id是不必要的。

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

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

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

UUID不是必需的;你可以在正确的条件下使用整数。

一个有用的特性是,系统中的所有对象都具有相同的大小键;您的“标识符”逻辑是通用的,您可以报告有关标识符的信息,而无需提前知道标识的是什么。使用UUID可以实现这一点。

UUID的另一个有趣特性是,我们有从数据计算UUID的标准方法(请参阅“命名UUID”);因此,您可能会获取一些业务数据——比如电话号码——生成相应的UUID,然后将其用作标识符(这会为您提供所有内容的相同性——UUID——但不会解决“如果电话号码发生变化怎么办?”问题)。

包嘉懿
2023-03-14

PhoneNumber已经是唯一的,所以Id是不必要的。

除了独特性之外,还有另一个非常重要的考虑因素:电话号码是PII。如果你的软件可能在美国、欧盟,甚至可能是世界上大多数国家使用,你就不能用它作为一个标识符,因为遵守隐私条例是非常困难的。例如,您不能记录它(这将使故障排除变得不可能),并且您需要能够在用户请求删除其数据的任何时候删除它,这在您需要保持数据库中的数据完整性时可能非常棘手(大多数情况下,您可以删除PII,而不删除数据库中的实际记录,但如果您的PK是PII,则会出现问题)。

 类似资料:
  • 这适用于添加或更新。但是,随着时间的推移,员工可能会被删除或重新分配到另一个部门。我认为删除应该是发送到EMPLOYEE主题的tombstone记录(k:empid,v:null)。但是,我不再拥有departmentId,我必须进行空检查(并为departmentId返回空),因此删除员工时不会发生removeEmployee。DepartmentID的更改也有类似问题。 那么,Kafka的方法

  • 我正在尝试创建一个公钥以允许我推送到Git,但我的. ssh文件夹尚未创建。 以下是我运行的命令: $ssh-keygen-t rsa-Cemaill@me.com 生成公共/私有rsa密钥对 输入保存密钥的文件(/h/.ssh/id\u rsa): 这就是H:驱动器配置、数据、配置文件、配置文件中的全部内容。V2 我认为有一个问题,因为当我得到提示输入文件,其中保存密钥(/h//. ssh/id

  • 我的客户端应用程序生成的数据在设备上加密。加密密钥通过HTTPS发送给Azure函数,该函数使用Azure密钥库存储加密密钥,以便其他授权的客户机可以获得加密密钥并解密数据。 下面是我的Azure函数中执行将加密密钥(秘密)保存在密钥库中的工作的一段代码: 问题 这样的设计是不是对Azure Key Vault的适当使用?

  • 问题内容: 我有一个字段,例如,在表中应该是唯一的。 使用Spring / Hibernate验证进行验证的最佳方法是什么? 问题答案: 一种可能的解决方案是创建自定义约束(和相应的验证器)。并要查找数据库中的现有记录,请提供(或Hibernate)to 的实例。 EntityManagerAwareValidator ConstraintValidatorFactoryImpl 唯一键 Uniq

  • 如果我尝试使用OpenSSL命令行生成3TDES加密的PKCS 8密钥: 我得到: PKCS8 RFC没有说明必须使用哪种算法来创建密钥块。它确实给出了PKCS5算法作为例子。有没有办法使用OpenSSL创建一个由DES密钥加密的PKCS8密钥?如果不是,它是OpenSSL不支持的还是一个非常不标准的事情? 下面是通过OpenSSL命令行(密码测试)使用基于密码的加密创建的示例: 这里是我手工制作

  • 问题内容: 我有两个表,和。有一个字段,它通过外键指向具有相同名称的字段。它还具有在该字段上声明的唯一密钥。不可为空。这意味着关系必须为0..1到1,因为每个 记录都必须具有唯一的而不是空的记录。 实体框架不这样看。我收到以下错误: 这是什么问题 如何使EF识别适当的关系多重性? 问题答案: EF抱怨是因为听起来您正在使用FK关联-这意味着VisualizationID是Entity的属性,并且也