Administrator
发布于 2024-08-04 / 1 阅读
0
0

Ref And Cited

引用 与 被引用

在业务中,我们经常能遇到,一个实体引用另一个实体的情况,

引用又分为一对一 和 一对多。

另外,我们还需要考虑,一个资源,被多个业务引用后,如果更改该资源,那么其他的业务,是希望同步修改,还是不再改动?即是不是那种快照性质的,一旦配置好了,就不希望再变了。

下面,我们分情况说。


我们都需要带着以下几个问题,去思考:

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


评论