2017-08-03 38 views
0

我們正在使用TypeScript開發MicroServices。後端是MongoDB,我們正在使用Mongoose。一個MicroService處理學校,另一個MicroService處理培訓。每個MicroService都維護着自己的數據庫。如何從MongoDB中的其他數據庫中引用實體?

學校模式需要參考培訓基於trainingID字段而不是_ID由MongoDB提供的字段。

我們將此參考定義爲普通字符串,使Training Collection中的trainingID的值將在School Collection中保存,其字段名稱與trainingID相同。

這是迄今爲止代碼:

SchoolModel.ts

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); 

TrainingModel.ts

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); 

問題

這是定義一個基準的最佳方式其他數據庫的實體?

+0

當我覺得微服務的,我覺得自我包含的,可以獨立位置,並沒有其他的服務作爲一個依賴應用程序。 – user602525

+0

但是當他們必須的時候,他們只是持有像主鍵這樣的東西。除了你描述的方式之外,我還沒有看到其他任何東西。我猜那些trainingID女孩是不可改變的。 –

回答

0

不可能的,我會說。

你在這裏進行建模你的數據似乎表明,一個學校可以分配一個唯一的訓練。對我而言,這聽起來有點語義錯誤,首先...?

如果這真的是你的意圖,你會想要把什麼東西都往同一文檔,只是項目的不同部分,從您的個人微服務(如果他們繼續有道理因爲設置)。否則,如果一所學校確實可以參考多個培訓,則需要在模式中參考培訓的集合。閱讀上populate(),以瞭解如何最佳模式的關係:

http://mongoosejs.com/docs/populate.html

+0

感謝大家的回覆。 @dnickless - 爲了使用populate(),我將不得不通過「ref」定義關係,它將引用「_ID」。我不想這樣做。培訓可以是多個。所以,我們可能會有一系列的培訓。但是從學校服務部門,我們會打電話給培訓服務來驗證培訓ID的有效性。另外,我不認爲這是另一個問題的完全重複。另一個問題是無法在Mongoose中維護2個不同的連接。 –

相關問題