【问题标题】:DDD Entity's Id modeling with existing databaseDDD 实体的 Id 建模与现有数据库
【发布时间】:2021-05-21 08:39:39
【问题描述】:

正如领域驱动设计中的文献所述,每个实体都由一个 ID 标识,通常为 long/int 或 GUID 类型。特别是我学习了 Vladimir Khorikov Domain Driven Design in practice 的课程。 当我在现有数据库上进行设计时,我该如何处理?

我必须处理来自我公司 ERP 的表格,所以我不能触摸或修改或忽略它们,我必须在这个持久层之上为我的实体建模。 几乎所有的表都没有整数标识符,而是各种类型的字段集。 如何将我的实体的“干净”概念与 Id 与它在没有整数 Id 的数据库中的持久性联系起来?

【问题讨论】:

    标签: c# asp.net entity-framework domain-driven-design clean-architecture


    【解决方案1】:

    您正在考虑将实体作为数据库表。这在 DDD 中不一定正确,因为在代码 Repositories 中并非如此。

    您从您的域公开的实体应遵循following definition

    不是由其属性定义的对象,而是由连续性及其标识定义的对象。

    就其他相互关联的域而言,您有一个实体,例如 Order。

    在您的数据订单域中,订单可以是多个数据库表的总和(即订单由客户、产品和商店定义)。要为此创建唯一 id,您可以使用多种技巧。

    1. 确实使用最顶层表格的 id(不适用于您的情况)
    2. 获取复合键值并创建哈希集。维护一个包含三元组和哈希集的本地数据库表,并在检索时使用此映射来访问底层 ERP 数据库。
    3. 加密字符串“value1;value2;value3”中的复合键值,并将加密值作为 id 发送。在检索、解密和访问底层 ERP 数据库时

    记住:领域不是关于内部实施,而是关于沟通和责任。

    【讨论】:

    • 谢谢你。我想知道像您这样涉及“散列”的解决方案。我有两个问题: 1- 如何从字符串加密到整数? 2-如何处理新实体的创建,例如使用 Hi/Lo 算法或更简单的我应该在从表的序列中“获取”一个 nextval 之前,但表有一个由许多字符串字段组成的键?
    • 为什么需要一个整数加密值?例如,GUID 既是字符又是数字。您可以使用字母数字 id,但我的建议是加密并更改为 Base64。
    • 新实体将按照过去创建的方式创建,创建后您将获取生成的数字并插入到您自己的表中。我不知道你的系统的来龙去脉,但你应该以某种方式确保一致性(最终或分布式事务)。
    • 别忘了点赞/接受有用的答案。
    猜你喜欢
    • 2023-04-03
    • 2018-08-03
    • 1970-01-01
    • 2021-10-31
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多