引用 与 被引用
在业务中,我们经常能遇到,一个实体引用另一个实体的情况,
引用又分为一对一 和 一对多。
另外,我们还需要考虑,一个资源,被多个业务引用后,如果更改该资源,那么其他的业务,是希望同步修改,还是不再改动?即是不是那种快照性质的,一旦配置好了,就不希望再变了。
下面,我们分情况说。
我们都需要带着以下几个问题,去思考:
1.删除被引用资源,应该怎么做,会有什么问题
2.更改被引用资源,应该怎么做,会有什么问题
3.查询被引用资源,应该怎么做,会有什么问题
一对一引用 & 同步修改
比如,现在scada_property 引用 scada_status_sphere。在表scada_property中,有一个status_sphere_id字段,记录了该属性,引用了哪一个状态球。
另外,此时有3条scada_property记录,他们引用了同一个scada_status_sphere记录。
要求如下:
1.update:如果更改scada_status_sphere记录,其他的引用该资源的scada_property记录,都要求做相应变更。
2.delete:如果 删除scada_status_sphere记录,那么要做被引用校验提示,确认是否解除引用关系
采取的方案如下:
将引用关系,也作为一个对象来看待,引用关系专门用一个表table_entity_ref来记录.
新建一条scada_property记录 和 对应的引用关系时,除了正常的,在表scada_property中加一个status_sphere_id字段,还需要在表table_entity_ref中,添加一条记录,记录引用关系。
这样,当删除被引用资源(scada_status_sphere记录)时,就可以根据表table_entity_ref中的记录,找到对应的引用关系,然后提示用户,当前资源被引用了,是否仍然删除并解除绑定关系。
注意:
当删除scada_property记录时,需要同步将表table_entity_ref中,对应的引用关系记录删除掉。
一对一引用 & 不同步修改(保留快照)
比如,现在scada_property 引用 scada_status_sphere。在表scada_property中,有一个status_sphere_id字段,记录了该属性,引用了哪一个状态球。
另外,此时有3条scada_property记录,他们引用了同一个scada_status_sphere记录。
要求如下:
1.update:如果更改scada_status_sphere记录,其他的引用该资源的scada_property记录,都要求不变,保留创建时的快照。
2.delete:如果 删除scada_status_sphere记录,那么要做被引用校验提示,确认是否解除引用关系
采取的方案如下:
被引用资源,创建2张表,一个是template表,一个是instance表。
下拉框,选择关联时,展示的是template表中数据,真正创建时,关联的是instance表中记录。
比如,现在提供2个表,scada_status_sphere_template表 和 scada_status_sphere_instance表。
当我们创建一个scada_property记录时,我们选择对应的状态球,即确定被引用资源时,针对scada_status_sphere_template表做下拉框查询,然后真正调用scada_property的创建接口时,就在scada_status_sphere_instance表创建对应的记录,然后scada_property关联instance表中记录。
此时,这里针对instance表,不提供增删改查的接口,instance表中的数据,只有当删除scada_property记录时,才能级联删除掉instance表中对应的关联数据。
template表,仍正常提供增删改查接口。
一对多引用 & 同步修改
假设一个DbOperation对象,引用了多个SafePrecation对象。
此时,在表table_safe_precation中,有一个operation_id字段,记录了该安全措施属于哪一次动火作业的。
要求如下:
1.update:如果更改了某条表table_safe_precation中的记录,其他的引用该资源的DbOperation记录,都要求做相应变更。
2.delete:如果 删除table_safe_precation记录,那么要做被引用校验提示,确认是否解除引用关系
采取的方案如下:
这里和上面的一对一不同,这里的一对多,是从表(table_safe_precation)中,记录了被引用关系(operation_id字段),所以不需要额外加一个引用关系表(table_entity_ref),
只需要在删除被引用资源(table_safe_precation记录)时,就可以根据operation_id字段,找到对应的引用关系,然后提示用户,当前资源被引用了,是否仍然删除并解除绑定关系。
注意:
当删除DbOperation记录时,需要同步将表table_safe_precation中,对应的关联记录删除掉。
一对多引用 & 不同步修改(保留快照)
假设一个DbOperation对象,引用了多个SafePrecation对象。
此时,在表table_safe_precation中,有一个operation_id字段,记录了该安全措施属于哪一次动火作业的。
要求如下:
1.update:如果更改了某条表table_safe_precation中的记录,其他的引用该资源的DbOperation记录,都要求不变,保持快照。
2.delete:如果 删除table_safe_precation记录,那么要做被引用校验提示,确认是否解除引用关系
采取的方案如下:
被引用资源,创建2张表,一个是template表,一个是instance表。
下拉框,选择关联时,展示的是template表中数据,真正创建时,关联的是instance表中记录。
比如,现在提供2个表,safe_precation_template表 和 safe_precation_instance表。
当我们创建一个DbOperation记录时,我们选择对应的状态球,即确定被引用资源时,针对safe_precation_template表做下拉框查询,然后真正调用DbOperation的创建接口时,就在safe_precation_instance表创建对应的记录,然后DbOperation关联instance表中记录。
此时,这里针对instance表,不提供增删改查的接口,instance表中的数据,只有当删除DbOperation记录时,才能级联删除掉instance表中对应的关联数据。
template表,仍正常提供增删改查接口。
引用关系表---table_entity_ref
refer to : https://blog.csdn.net/yjshang/article/details/5899923