【问题标题】:MongoDB Improve Efficiency of this Collection DesignMongoDB 提高了这种集合设计的效率
【发布时间】:2020-12-18 08:00:54
【问题描述】:

问题:我想知道我在这里的设计是否可以改进为对我的用例更有效的东西。我相信有更好的选择,我希望在答案中提出。但如果没有,我想知道我的哪个选项最适合以下用例。

我正在为一个医生预约应用程序设计该系列。我有两种选择,但我不知道哪一种最有效,因为我是 NoSQL 的新手。
现在,我需要介绍的用例是:

  1. 查询特定日期的约会
  2. 查询医生预约情况
  3. 查询患者预约情况

我已经收集了患者、医生、MedicalUnit 和时间表。设计如下。我只包括了必要的:

// patient
{
  _id: id
  name: string
  // etc
}

// doctor
{
  _id: id
  name: string
  // etc
}

// medicalUnit
{
  _id: id
  name: string
  // etc
}

// schedule
{
  _id: id
  date: date
  event: {
    place: medicalUnit
    time: time
    duration: int
  }
  attendingPhysicianId: doctor._id
}

选项 1
我相信这个选项在读取查询方面给了我很好的性能,比如按日期或按病人查询的用例。我也可以通过医生查询,但我需要先通过主治医师ID从日程数据库中获取,然后使用日程表ID。不利的一面是,我认为我可能会将一致性置于风险之中,尤其是当有人更新时间表时(例如更换主治医师)。

{
  _id: id,
  date: date,
  scheduleId: schedule._id
  examInfo: {
    doctorName: doctor.name
    medicalUnitName: medicalUnit.name
  }
  patientId: patient._id
}

选项 2
这个会有更好的一致性,但是我需要从多个集合中多次读取。例如,按日期查询约会意味着我需要先按日期获取日程,然后使用 scheduleId 从该集合中检索。另外,由于计划集合中的医生信息非常少,因此我还需要获取医生集合。

{
  _id: id,
  scheduleId: schedule._id
  patientId: patient._id
}

医生集合可能很少更新,所以你们中的一些人可能会提出一个用于 inmem 缓存的选项。是的,应该可以,但我想看看是否有可能没有其他附加组件。

【问题讨论】:

  • 投反对票:为什么投反对票?我做了我的研究,只在事情陷入困境时才问,至少解释一下你为什么不投票!

标签: mongodb database-design nosql


【解决方案1】:

对于哪种设计最好,没有唯一的正确答案。

我建议考虑每种操作的执行频率、每种操作需要多长时间,并比较不同选项对单个操作以及整个系统的影响。

例如,考虑一个可能的差异。日程表需要能够被医生过滤,并且显示日程表记录应该包括医生的姓名。所以一些可能的结构是:

结构

A) 链接
- 时间表和医生存储在单独的集合中 - 每个时间表都包含医生的 ID - 没有数据存储在 2 个位置(标准化)

B) 嵌入式
- 时间表存储在自己的集合中 - 医生收藏仅供编辑日程时参考 - 每个医生的所有数据都完全包含在每个计划文件中(完全去规范化)

C) 混合
- 时间表和医生存储在单独的集合中 - 每个时间表都包含医生的 ID,以及关于医生的足够信息(即姓名和专业),以用于大多数显示功能(部分去规范化)

任务

可能发生的几个前端操作:

  1. 以表格或分页的方式列出时间表,除了时间表详细信息外,还显示医生的姓名和专业
  2. 显示特定时间表的完整医生详细信息
  3. 更改医生的详细信息

操作

因此,我们需要考虑在每种考虑的场景中每种类型的前端操作所必需的后端操作:

操作 1:显示带有医生姓名的日程表列表
一)
- 查询时间表集合以检索所需的时间表
- 对于每个时间表,查询医生集合以检索与 id 匹配的名称

B)
- 查询计划集合以检索所需的计划

C)
- 查询计划集合以检索所需的计划

操作 2:显示特定时间表的医生详细信息
一)
- 查询单个文档的时间表集合
- 查询匹配文档的医生集合

B)
- 查询单个文档的时间表集合

C)
- 查询单个文档的时间表集合
- 查询匹配文档的医生集合

操作 3: 更改医生的详细信息 一)
- 更新医生集合中的单个文档

B)
- 更新医生集合中的单个文档 - 使用新数据更新所有匹配的计划文件

C)
- 更新医生集合中的单个文档 - 如果更新了医生的姓名或专业,则使用新数据更新匹配的时间表文件

对于其中的每一个,我们需要考虑操作的数量:

1A)
- 每个时间表读取 1 次以检索时间表详细信息 - 每个计划读取 1 次以检索医生详细信息

1B)
- 每个时间表读取 1 次以检索时间表 + 医生详细信息

1C)
- 每个时间表读取 1 次以检索时间表 + 医生姓名/专业

影响

然后考虑每个前端操作的发生频率、每个后端操作对时间/资源的影响,并计算单个前端操作实例的影响差异(代表用户看到的延迟) 和整个时间段(对系统影响的代理)。

可以在测试环境中轻松测量单次操作的影响。

确定整体系统影响需要大量建模、负载测试和预测。

总结

每种数据结构都适用于不同的应用程序和负载模式。确定哪一个最适合您的应用程序和加载模式,如果没有深入了解您的数据和应用程序,任何人都无法可靠地告诉您,这远远超出了我们期望从诸如此类的问题网站获得的收益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多