gpt4 book ai didi

entity - 持久性无知如何与(非根)聚合的引用一起工作?

转载 作者:行者123 更新时间:2023-12-02 11:33:44 24 4
gpt4 key购买 nike

我们有几个聚合根,它们有两种主要的识别方法:

  • 一个整数“键”,用作数据库中的主键(并通过引用聚合用作外键)以及应用程序内部的主键,并且无法通过公共(public)网络 API。
  • 基于字符串的“id”,它还唯一标识聚合根,并且可以通过公共(public) Web API 访问。

使用基于整数的私有(private)标识符和基于字符串的公共(public)标识符有几个原因 - 例如,数据库性能更好(8 字节整数而不是可变长度字符串)并且公共(public)标识符很难猜猜。

但是,这些类在内部使用基于整数的标识符相互引用,如果基于整数的标识符为 0,则表示该对象尚未存储到数据库中。这会产生一个问题,因为实体在保存之前无法引用其他聚合根。

如何解决这个问题,或者我对持久性无知的理解是否存在缺陷?

编辑有关基于字符串的标识符

基于字符串的标识符由连接到 PostgreSQL 数据库的存储库生成,该数据库生成标识符以确保它不会与数据库中当前的任何内容发生冲突。例如:

class Customer {
public function __construct($customerKey, $customerId, $name) {
$this->customerKey = $customerKey;
$this->customerId = $customerId;
$this->name = $name;
}
}

function test(Repository $repository, UnitOfWork $unitOfWork) {
$customer = new Customer(0, $repository->generateCustomerId(), "John Doe");
// $customer->customerKey == 0
$unitOfWork->saveCustomer($customer);
// $customer->customerKey != 0
}

我假设相同的概念可用于创建一个基于整数的非 0 键的实体,并且工作单元可以使用数据库中不存在该实体的事实作为 INSERT 的理由而不是更新。上面的 test() 函数将变成:

function test(Repository $repository, UnitOfWork $unitOfWork) {
$customer = new Customer($repository->generateCustomerKey(), $repository->generateCustomerId(), "John Doe");
// $customer->customerKey != 0
$unitOfWork->saveCustomer($customer);
// $customer->customerKey still != 0
}

但是,考虑到上述情况,如果工作单元未按正确的顺序保存数据库对象,则可能会发生错误。有办法解决这个问题以确保工作单元以正确的顺序保存实体吗?

我希望上述编辑能够澄清我的情况。

最佳答案

将聚合视为一致性边界是一个很好的方法。换句话说,两个不同的聚合具有不同的生命周期,您应该避免在同一事务中将它们的命运捆绑在一起。根据该公理,您可以放心地声明,从另一个聚合 B 的角度来看,聚合 A 的 ID 永远不会为 0,因为创建 A 的事务尚未完成且 B 不可见,或者它已完成A 有一个 ID。

关于双重身份,我宁愿使用语言生成的字符串 ID,而不是数据库生成的字符串 ID,因为我认为提供唯一 ID 意味着可能跨多个表的事务。语言通常可以生成具有良好熵的唯一字符串。

关于entity - 持久性无知如何与(非根)聚合的引用一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32389857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com