【问题标题】:How to build an active record association between three models如何在三个模型之间建立活动记录关联
【发布时间】:2019-09-09 10:37:07
【问题描述】:

我正在尝试为医生建模一个应用程序,但我一直在纠结数据库设计。让我们假设用户可以创建一个案例,该案例可以与症状、诊断和治疗相关联。首先,这听起来并不难。

但是,我需要医生从给定的表格中提供诊断,其中包括所有已知的诊断(由管理员播种)。此外,一种诊断可以有多种疗法,而医生应为该特定病例选择一种疗法(同样,所有可能的疗法都由管理员播种)。

我还没有开始实际编写应用程序,但我创建了一个db diagram。到目前为止我能想到的最好的方法是将casesdiagnoses 关联到has_and_belongs_to。这似乎也不是最优的,因为一个病例只能有一个诊断。 无论如何,我真的不太清楚如何处理therapies 作为一个案例,只有has_one 治疗和诊断可以has_many 治疗。

我也考虑过使用 jsonb 列,但我宁愿坚持使用关系方法。

非常感谢您对此的任何意见!

【问题讨论】:

    标签: sql ruby-on-rails database postgresql activerecord


    【解决方案1】:

    据我了解,您需要一个支持以下逻辑的模型:

    • 一个病例只能有一个诊断
      • 可以从选项列表中选择诊断
      • 一个诊断可以有多种治疗方法
    • 一个病例只能有一种疗法

    如果那是正确的,那么到目前为止您所拥有的看起来还不错。几个cmets/问题:

    1. 如果每个病例只能有一个诊断,为什么不将diagnosis_id 作为属性包含在cases 表中?除非您需要专门跟踪病例诊断关系之间的任何其他数据(您现在没有这样做),否则您不需要单独的表。这可能会通过删除额外的JOIN 来加速您的查询。如果仔细考虑它可能会改变,那么您可以将其作为单独的表格保留。

    2. 如果一个病例只能接受一种治疗,您可以再次将其作为属性包含在cases 表中。请参阅 #1 中的逻辑。

    3. 当您说一个诊断可以有多种疗法时,您的意思是用户将为一个诊断分配一种或多种疗法吗?如果是这种情况,那么只需创建一个名为 case_diagnosis_therapy 的新表,您可以在其中进行跟踪。病例的诊断和治疗之间的关系将通过(case_id, diagnosis_id)。您已经拥有diagnoses 查找表。

    4. 是的,我同意您更适合坚持使用关系设计而不是 JSON。你的模型看起来很有条理。

    5. 只是对约定的建议,当您创建表名时,通常使用单数名称 - case 而不是 cases

    只需考虑几件事,否则看起来还不错!希望对您有所帮助。

    【讨论】:

    • Mmm 在 rails 中(以及在我的长期经验中)表名通常是复数(因为表包含多行),但是 YMMV,但在 rails-world 中至少这个是常见的做法。
    【解决方案2】:

    据我了解,一个案例

    • 有很多:图像
    • 有很多:症状
    • 有来自固定的可能诊断列表中的许多诊断,您正确解决了这些问题。我唯一的评论是调用参考diagnose_id(来自case_diagnoses 表)

    唯一缺少的是therapies 关联。我看到两个可能的选择:

    • 治疗总是与单一诊断相关联
    • 一种疗法可能与多种诊断相关

    例如对于发烧和脚踝扭伤,治疗都可以是“冷却”,或者它们可以更具体(和更多的诊断相关)。所以这还不清楚。

    因此,如果治疗总是与单一诊断相关联:

    • 治疗属于诊断
    • 一个病例有许多病例疗法
    • 病例治疗属于_治疗

    如果一个疗法可以属于多个诊断,你只需要添加一个中间链接表

    • diagnose-therapies-属于治疗和诊断

    ...其余的保持不变。

    (哦,感谢您分享 dbdiagram.io 平台,我以前从未听说过,看起来很棒!)

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2013-04-22
      相关资源
      最近更新 更多