問題:
在數據庫中多處使用到了字典,現在平台需要對字典進行管理,也就是現在的字典表不再是固定的,他是可以變化的,可以增加,刪除,變更。
在刪除的時候就需要之前引用這個字典值的地方清空
比如說字典里面有個字典YY_title(頭銜),它里面有個(1,博士),專家表里面有三條數據引用了這一條字典記錄,在專家表里面只存了一個“1”,當然這個字典可以被n個業務表引用,如果說現在的頭銜里面不再使用博士這一項了,那么之前業務表里面存的“1”自然是要置空的,現在的問題是怎么通過字典找到引用他的業務表?
實際場景:
解決方案:
新建關聯表(中性表),關系表的結構如下圖:【中間過程,有問題,正確結構圖在下面】
對關聯表的操作放在業務表的處理過程中:
(1)增加記錄:在業務表新增記錄的時候就新建一條關系記錄,並將關系表的id存在業務表中
(2)修改記錄:在業務表中修改(添加)存放的值的時候,修改關系表中的字典的值
應用過程出現的問題:
(1)在我將某個標簽(字典值)刪除的時候,需要將引用其的業務項的該字段置空:
UPDATE ${param1} SET ${param2} = '' WHERE id = #{param3}
這段代碼理論上是沒有問題的,執行結果也對。
但是!!!接下來在查詢引用該字段的業務項的數量時發現結果竟然不是零!!代碼如下
SELECT count(id) FROM zgl_dictlink a WHERE a.dicttype= 'yy_title' and a.dictvalue= '0'
這段代碼理論上是也沒有問題的,那么是什么原因導致的這個現象?
仔細分析下,原來是數據庫結構設計的有問題!有冗余。。
既然在字典的關系表中標明了使用到的表名,字段名,實體id,又為什么要在業務表中添加字典聯系表的id呢。所以說這個id是多余的。
該方案的缺點:
優化:
(1)這可以在字典值表中新加個調用次數字段,用於統計被調用次數。(在沒有使用中性表的時候這種方法對於統計調用次數是非常有效的,當然在使用了中性表后,調用次數可以直接的中性表中查詢)
(2)緩存。這個現在知識一個想法,具體實現之后再補充。。