首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混淆病人、牙医、治疗和病史的实体和总根

混淆病人、牙医、治疗和病史的实体和总根
EN

Stack Overflow用户
提问于 2020-05-02 21:54:36
回答 2查看 412关注 0票数 0

我刚开始使用DDD,并且决定用我正在开发的牙科诊所系统来练习它,但是我很难为这个领域建模,所以额外的一双眼睛将会受到极大的感谢。对于这个牙科系统,领域专家告诉我,一个病人只有一份病史。病历必须有一个记录号码,这在系统中是独一无二的。病史记录了病人可以接受的牙科治疗(比如计划中的治疗)以及病人已经接受的治疗。每种治疗都有一个价格,因此病史中包含了一个总价(基于计划/应用的治疗)。当病人接受治疗时,他/她必须支付至少50%的治疗费用,这意味着他/她最终将在今后的预约中支付其余的费用(如果没有治疗计划,他/她将必须支付100%的治疗费用)。最后,这个牙科诊所让病人可以选择用不同的货币付款,因为有时候一天来的病人只有欧元,但后来他决定他想要一个计划,未来的预约会付英镑。

基于所有这些,以及我对DDD的入门知识,我的第一个想法是,我有以下这些实体:

  • 有耐心的
  • 治疗
  • 牙医

我将有几个值对象,但最重要的可能是:

  • 货币(用于价格和货币)
  • 签名(用于应用治疗)
  • 牙齿或牙齿(用于治疗实体)

我只能找到一个汇总,这是病史,因为它汇集了病人的信息,以及治疗(计划和应用)。但这将意味着,每当我更新医学历史,我将不得不更新病人的信息和治疗,即使其中一个从未改变。病人可以改变他们的个人信息,这将反映在病史,但它不影响治疗。

我对如何建模有点困惑。请帮帮我!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-03 16:42:06

请记住,Aggregates以及扩展到有界上下文(BC)是一组数据和业务逻辑,它们属于一起(以及最有可能需要通过事务方式改变的事情)。聚合包含的数据之所以存在,是因为业务逻辑需要它,而不是因为某些应用程序屏幕需要它。这是非常重要的,以消除一些混乱,并释放您的一些限制,以设计您的聚合。

例如,当您向用户显示医疗历史记录时,您可能希望显示病人的姓名、地址、年龄等,以及治疗价格,但如果您仔细考虑,您就不需要这些信息来管理医疗历史记录。根据您的说法,“医学历史”有一个记录号、一个PatientId和一个TreatmentIds列表,其中可能包含完成这些记录的日期。

当您想要向用户显示医疗历史记录时,可以使用UI组合。因此,您可以获得医学历史记录(主要是一堆Ids和日期)。然后从“医学史”的PatientId中,你可以从拥有它的不列颠哥伦比亚省获得病人的信息。从TreatmentIds中,您可以从拥有它的一些BC获得治疗描述,并从它们所属的BC那里获得它们的价格。

因此,基于此,您可以构建聚合,而不是基于您域上的“相关名称”,比如患者、治疗或牙医,而是根据它们实现的业务逻辑。

这只是胡思乱想,但我能想到:

BC营销(因为没有更好的名字):包含所有治疗的描述,关于牙医的信息,关于房间和材料的信息,等等,文本,图片和其他细节。

BC财务:包含每种治疗的价格信息,每次付款的付款记录,每个病人的信用和借方,等等,负责跟踪所有这些事情。例如,它可以知道治疗什么时候开始/结束,并取决于病人的记录,需要50 %或100%的付款。这里不需要与医学史直接相关,只需要知道它是否是第一次治疗。

BC调度:负责安排新的治疗,并跟踪他们什么时候开始和完成。这可能包含历史记录,也可能在其他地方,如果需要的话。

BC医疗:负责保存所有的医疗记录,过敏,牙齿状况的医疗细节等。

BC患者护理:负责跟踪患者的信息、姓名、国籍、联系方式等。

一旦了解了有界上下文,就可以定义聚合。每个公元前可以有一个或多个。另外,有些事情可能不是一个集合。例如,如果医疗历史记录基本上是治疗is及其创建日期的记录,并且没有相关的业务逻辑,那么它可能不需要实际的汇总(历史记录不会拒绝治疗,对何时应该进行治疗有意见,等等,这只是一个历史)。

不要把这看作是一个推荐的设计,而只是一个思考的过程,想出你自己的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2020-05-03 02:50:20

实体有一个Id,其中作为值对象具有结构标识,这意味着如果两个值对象具有相同的值,那么它们是相同的。

在钱的情况下,两张5美元的钞票没有差别,所以它可以是一个值的对象。

您还没有描述过Tooth和签名的角色和属性。

如果是牙,那是谁的牙重要吗?你能用其他具有相同属性的牙齿替换病人的牙齿吗?如果它确实重要,那么Tooth需要一个Id,因此它是一个实体。

在签名的情况下,您将如何比较两个签名?您是否有一个图像识别软件,可以比较两个签名的外观,并确定它们是相同的?你可能有两个有着相似的签名的病人,他们的签名应该被视为相同吗?

如果您选择医疗历史作为一个聚合,那么您应该把它作为一个对象。你想载入整个病史,以增加一个新的治疗吗?治疗能否与另一个实体相关联,如牙医?如果您可以单独使用部分病史(如治疗),那么它就不是一个集合。

一些好的教程:

  1. https://enterprisecraftsmanship.com/posts/entity-vs-value-object-the-ultimate-list-of-differences/:弗拉基米尔·霍里科夫
  2. https://lostechies.com/jimmybogard/2008/05/21/entities-value-objects-aggregates-and-roots/:吉米·博加德
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61566824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档