需要有关单个集合中多种类型项目的 MongoDB 架构的建议

问题描述 投票:0回答:1

我正在设计一个“行程规划器”应用程序。这个概念很简单,每个行程都会有三种类型的项目:

  1. 交通:有
    startDate
    endDate
    provider
    source
    destination
    等字段。
  2. 住宿:有
    startDate
    endDate
    provider
    location
    等字段。
  3. 活动:具有
    startDate
    endDate
    name
    location
    等字段。

您可能已经注意到,这些项目总是具有相似但不完全相同的字段。我最终得到了以下架构:

const transportationSchema = new Schema({
  startDate: Date,
  endDate: Date,
  provider: String,
  mode: String,
  source: String,
  destination: String,
});

const accommodationSchema = new Schema({
  startDate: Date,
  endDate: Date,
  provider: String,
  location: String,
});

const activitySchema = new Schema({
  startDate: Date,
  endDate: Date,
  name: String,
  location: String,
});

const itinerarySchema = new Schema({
  tripId: { type: ObjectId, ref: "trip" },
  type: String,
  transportation: transportationSchema,
  accommodation: accommodationSchema,
  activity: activitySchema,
});

const ItineraryModel = mongoose.model("itinerary", itinerarySchema);

可以通过给予

tripId
来拉动行程元素。但这会导致 API 输入验证变得比应有的困难。例如,如果 API 中的
type
字段是
transportation
,我需要手动检查其中存在的条目。我并不是说其他输入验证很容易,但如果一切都是平面结构,它们看起来就不那么混乱了。

这些场景有行业标准吗?我也不想通过为每个行程类型创建一个集合来使查询变得复杂。我应该做什么以及如何构建数据库?

node.js database mongodb mongoose mongodb-query
1个回答
0
投票

1:1 关系易于建模和编码。在您的情况下,每个键都具有 1:1 关系。这就是现在的状态。

让我们考虑一个情况,您需要开发一个函数,该函数接受 communicationsSchema 中的键。这个功能的界面如何设计?它会是一个接受 2 个日期和 4 个字符串参数的函数吗?如果是这样,您将如何将实际值传递到同一函数中?同样,2 个日期值和 4 个字符串值。如果您设计一个接受对象的函数,您可能会获得什么优势?正式论证的数量会减少到只有一个吗?实际参数的数量会减少到只有一个吗?如果您稍后决定除了现有的 6 个值之外还传递一个数值,结果会怎样?您将如何融入这一变化?

简而言之,子文档用于构建数据模型。这将带来更好的思维模型、更容易的编码和维护。今天或明天是否采取这一步取决于你是否接听电话,但随着你的前进,这将是不可避免的。

谢谢 我们做最好的4你。

© www.soinside.com 2019 - 2024. All rights reserved.