我们正在使用 TypeScript 开发微服务。后端是MongoDB,我们正在使用Mongoose。一个微服务处理学校,另一个微服务处理培训。每个微服务都维护自己的数据库。
学校模型需要引用基于训练 ID
字段的训练,而不是 MongoDB 提供的_ID
字段。
我们将此引用定义为纯字符串,以便训练集合中的 trainingID
值将保存在与 trainingID
相同的字段名称的学校集合中。
以下是迄今为止的代码:
import { Document, Schema, Model, model } from "mongoose";
import { ISchoolModel } from './ISchoolModel';
export const schoolSchema = new Schema({
schoolId: String,
schoolName: String,
trainingId: String
});
export interface ISchool extends ISchoolModel, Document {
}
export const SchoolModel: Model<ISchool> = model<ISchool>("School", schoolSchema);
import { Document, Schema, Model, model } from "mongoose";
import { ITrainingModel } from './ITrainingModel';
export const trainingSchema = new Schema({
trainingId: String,
trainingName: String,
trainingDescription: String
});
export interface ITraining extends ITrainingModel, Document {
}
export const TrainingModel: Model<ITraining> = model<ITraining>("Training", trainingSchema);
这是定义对其他数据库中实体的引用的最佳方式吗?
不太可能,我会说。
您在这里对数据建模的方式似乎表明,一所学校只能分配一项培训。对我来说,这一开始就听起来有点语义错误...?
如果这真的是你的意图,你会想把所有东西都放在同一个文档中,并简单地从你的单个微服务中投影不同的部分(如果它们在这种设置下仍然有意义的话)。
否则,如果一所学校确实可以引用多个培训,那么你需要在你的模式中引用一组培训。阅读populate()
,了解如何为关系建模:
http://mongoosejs.com/docs/populate.html