我正在设计一个“行程规划器”应用程序。这个概念很简单,每个行程都会有三种类型的项目:
startDate
、endDate
、provider
、source
、destination
等字段。startDate
、endDate
、provider
、location
等字段。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
,我需要手动检查其中存在的条目。我并不是说其他输入验证很容易,但如果一切都是平面结构,它们看起来就不那么混乱了。
这些场景有行业标准吗?我也不想通过为每个行程类型创建一个集合来使查询变得复杂。我应该做什么以及如何构建数据库?
1:1 关系易于建模和编码。在您的情况下,每个键都具有 1:1 关系。这就是现在的状态。
让我们考虑一个情况,您需要开发一个函数,该函数接受 communicationsSchema 中的键。这个功能的界面如何设计?它会是一个接受 2 个日期和 4 个字符串参数的函数吗?如果是这样,您将如何将实际值传递到同一函数中?同样,2 个日期值和 4 个字符串值。如果您设计一个接受对象的函数,您可能会获得什么优势?正式论证的数量会减少到只有一个吗?实际参数的数量会减少到只有一个吗?如果您稍后决定除了现有的 6 个值之外还传递一个数值,结果会怎样?您将如何融入这一变化?
简而言之,子文档用于构建数据模型。这将带来更好的思维模型、更容易的编码和维护。今天或明天是否采取这一步取决于你是否接听电话,但随着你的前进,这将是不可避免的。
谢谢 我们做最好的4你。