Angular 2 前端 http 传输 model 对象及其外键的问题
个人随笔,记录问题及思路草稿,非文章性质。
对于设备编辑场景,需要显示设备类型(外键),
前端有如下 TypeScript model(此 model 和后端实体 model 通常相对应):
export class DeviceDef {
id: string;
name: string;
seq: string;
sn: string;
modelType: number;
comEndPoint: ComEndPoint;
应用哪一个?
deviceTypeId: string;
deviceType: DeviceType;
}
服务端数据应如何传才能做到,不会因为不小心拉出整个外键链,且统一规范?
如果让开发在每处地方自行处理返回数据,则开发和可能直接返回整个 deviceType 对象,而 deviceType 对象还有其它外键,从而造成 json 序列化时的级联加载,加载 N 多不需要的数据
所以要解决的问题:
- 避免数据级联加载,加载 N 多不需要的数据
- 数据缓存,已存在的无需再加载
- 数据引用一致,对于多个 detail 引用同一个 deviceType 外键,deviceType 应是一个对象(可以获得省内存,和联动更新的好处)。
- 单个的规范,和列表的规范,尤其是列表,存在很多 item 引用同一个外键的情况。
- 一套规范和一个处理外键关联的统一框架
规定,服务端对于外键,统一传 id
那么,外键的数据,如何取得?开发手动再根据外键取得 相关数据吗?
方案1:
开发人员在 ts 的 model 里,先配置好,那个属性,对应的外键对象是什么,可以用注解配置,或者代码配置
方案2:服务端返回的不是当前 detail 的纯 model,还有一些其它元数据和外键部分数据
对于单个查询
{
item:{
id:1,name:”设备1”,deviceTypeId:”123”
// 一对多
childs:[1,2,3]
},
references:{
deviceType:{
“123”:{id:”123”,name:”设备1"}
}
child:{
1:{},
2:{}
}
}
}
列表的:
{
}
数据缓存,已存在的无需再加载 的问题好解决
但是,对于要加载一个 detail,但是其外键要等服务端加载完后才知晓本地有没有缓存的情况下
如何在减少服务端查询从而提升请求速度和服务端先加载外键数据,好减少客户端等待首次请求成功后发现本地没有缓存从而需要二次请求服务器造成 串行查询 等待时间更长?
应需要不同情况不同对待
如,对于热数据,如设备类型、请假类型 等,很常用,但是数据量又小(即很适合缓存在前端),本地很可能已存在缓存的情况下,服务端采用一种查询策略。 客户端还可相互配合,在请求某个 detail 时,因为需要的外键类型已经知道,则前端框架可将本地以及查询/缓存过了的外键 id 自动追加到这个 detail 的请求头里面(因为是热数据,数据量也不会大,不过这需要定个规则),后端自动解析处理,如果前端已缓存了这个外键 id,则无需返回,如果没有,则查询并返回。
对于非热数据,或一次性数据,则另外处理。
这适用于所有工程化前端框架。