需求
TitanHouse Titan Portal 简历分块保存。基本信息单独保存,每个Experience单独保存,等等。
技术设计
Talent 作为 mainContentModel,任何相关信息变更,Talent的版本都要+1,除Talent之外,任何其他ContentModel的实例只有在自身发生变化时才去保存。
业务代码示例
Talent端
// 用户注册即创建一个新的 Talent,只有最基本的email
Talent.create(talent) {
time = getTime();
uesr = getUser();
newObject {
...
version = 1,
createdBy = user,
createdAt = time,
deletedAt = NULL
} to Talents
}
// Talent修改基本信息
Talent.update(talent) {
latestVersion = Talent.getLatestVersionFromMain(talent.id);
time = getTime();
uesr = getUser();
newObject {
...
version = latestVersion + 1,
createdBy = user,
createdAt = time,
deletedAt = NULL
} to Talents
// Talents_WorkIndustries 由于后端无法区分industries数组中的每一项是修改出来的,还是删除新增出来的,所以对于这类相关联的两个表,通过一个保存按钮进行保存的,统一做“全部丢弃后新增”处理。
// 版本管理层对于此种情况有两种处理方式,一种是遍历出原有的industries置为删除状态;另一种不管原有industries,直接新建一组industries,查询时通过与talent一致的createdBy和createdAt取出。
for (industry in talent.industries) {
newObject {
talentId,
industryId,
...
version = 1,
createdBy = user,
createdAt = time,
deletedAt = NULL
} to Talents_WorkIndustries;
}
}
// 新增一个experience
Experience.create(exp) {
time = getTime();
uesr = getUser();
newObject {
companyId,
...
version = 1,
createdBy = user,
createdAt = time,
deletedAt = NULL
} to Experiences
// Generate new Talent version
Talent.newVersionWithoutChange(exp.talentId, user, time);
}
// 更新一个experience
Experience.update(exp) {
// Get the latest version number.
latestVersionEntity = private.getLatestVersion(exp.experienceId);
newObject {
companyId,
...
version = latestVersionEntity.version + 1,
createdBy = user,
createdAt = time(),
deletedAt = NULL
}
// Generate new Talent version
Talent.newVersionWithoutChange(exp.talentId, user, time);
}
// 获取实例指定版本所关联的其他类型实例
Talent.fetchWithRelativeEntities(talentId, version) {
// Get the specific version talent.
talent = select * from Talents where talentId = talentId && version = version;
talent.industries = select * from Talents_WorkIndustries where talentId = talentId && createdBy = talent.createdBy && createdAt = talent.createdAt;
// Get upperTimeLimit.
upperTimeLimet = talent.createdAt;
// Get all the experiences which createdAt less than upperTimeLimit.
experiences = distinct(experienceId, 'select * from Experiences where talentId = talent.id && createdAt <= upperTimeLimit orderBy createdAt desc');
for (exp in experiences) {
exp.company = distinct(companyId, 'select * from Companies where experienceId = exp.experienceId && createdAt <= upperTimeLimit orderBy createdAt desc');
push(talent.experiences, exp);
}
return talent;
}
// 关于主表
// 每次存储新版本到history表后,覆盖主表