1、使用場景
因爲最近在做項目過程之中需要給一個課程的資源(視頻、文檔),做標籤的添加、編輯操作。下面分別對添加和編輯操作需要做哪些事情做做以下相關的描述以供大家探討。
有一種簡單粗暴的實現方法:
每次都是先刪除,後增加;本人對此方式比較反對,這樣MySQL數據庫能在沒有操作或者操作很少的情況產生大量Binlog日誌。
如果針對添加刪除進行最簡單粗暴方式 直接先刪除後添加將會有以下幾點弊端
(1)、如果前端未做任何操作 講執行一次批量刪除操作和批量寫入操作,於是就產生2份binlog日誌
但是實際情況 數據庫根本無需做任何操作的。
(2)、如果僅僅只取消了一條記錄 本身只需做一條刪除操作,結果也會執行先刪除後增加
(3)、如果訪問量巨大,將導致數據的IO訪問瓶頸
binlog 基本認識
MySQL的二進制日誌可以說是MySQL最重要的日誌了,它記錄了所有的DDL和DML(除了數據查詢語句)語句,以事件形式記錄,還包含語句所執行的消耗的時間,MySQL的二進制日誌是事務安全型的。
一般來說開啓二進制日誌大概會有1%的性能損耗(參見MySQL官方中文手冊 5.1.24版)。二進制有兩個最重要的使用場景:
其一:MySQL Replication在Master端開啓binlog,Mster把它的二進制日誌傳遞給slaves來達到master-slave數據一致的目的。
其二:自然就是數據恢復了,通過使用mysqlbinlog工具來使恢復數據。
二進制日誌包括兩類文件:二進制日誌索引文件(文件名後綴爲.index)用於記錄所有的二進制文件,二進制日誌文件(文件名後綴爲.00000*)記錄數據庫所有的DDL和DML(除了數據查詢語句)語句事件。
以下是本人的實現思路:
標籤添加:
1、標籤可能來至兩類:1.1 可以從已經存在的標籤之中選擇一個(使用類似於AutoSuggest組件),1.2、可能是自己新輸入的標籤。
2、針對選擇已經輸入的標籤或者新增加的標籤,新增的標籤存儲在標籤標籤之中,返回標籤(newTagId),然後與選擇的已有的標籤(selectedTagId),然後在存儲在 資源與標籤表的對應關係表之中。建立對應關係。
新建資源標籤 操作流程圖如下所示:
編輯資源標籤的 操作流程圖如下所示:
本人是建議前端使用Vue組件 https://voerro.github.io/vue-tagsinput/ 後來由於前端無法研究如何調用選擇後的方法,放棄使用此控件,我本人是力推的。
2、實現方法
2.1 主要針對刪除資源標籤關係過程之中需要設計 多參數傳入後端。需要傳遞如下兩個參數 資源id,刪除的標籤idList
於是乎設計傳遞過個參數到後端的MyBatis之中具體實現代碼如下:
/**
* 獲得資源標籤結果
* @param param
* @return
*/
List<Map<String, Object>> getAutoSuggetEnclosureTagList(Map<String, Object> param);
/**
*批量添加資源標籤到標籤表之中
* @param tagList
* @return
*/
int addBatchEnclosureTagList(List<Map<String, Object>> tagList);
/**
* 批量添加資源與資源標籤的關係的記錄
* @param enclosureTagList
* @return
*/
int addBatchEnclosureTagRelationList(List<Map<String, Object>> enclosureTagList);
/**
if(deleteTagList.size()>0){
List<Long> deleteTagIdList=new ArrayList<Long>();
for(Map<String, Object> itemMap:deleteTagList) {
Long delTagId=Long.parseLong(itemMap.get("id").toString());
deleteTagIdList.add(delTagId);
}
Map<String, Object> deleteTagRelationParams=new HashMap<String, Object>();
deleteTagRelationParams.put("resourceId", courseEnclosure.getId());
deleteTagRelationParams.put("deleteTagIdList", deleteTagIdList);
deleteBatchEnclosureTagRelationList(deleteTagRelationParams);
}
* 刪除資源標籤關係表之中相關信息
* @param deleteTagRelationParams
* @return
*/
int deleteBatchEnclosureTagRelationList(Map<String, Object> deleteTagRelationParams);
<!-- 獲得可選的資源標籤搜索 -->
<select id="getAutoSuggetEnclosureTagList" resultType="hashmap" parameterType="hashmap">
SELECT
t.id,
t.tag_descn as tagName
FROM
tag AS t
WHERE
t.tag_category IS NULL
AND t.owner_company =#{ownerCompany}
<if test='searchContent != null and searchContent != ""'>
AND t.tag_descn LIKE CONCAT('%',#{searchContent},'%')
</if>
ORDER BY t.id ASC
</select>
<!-- 批處理添加資源對應的標籤記錄 -->
<insert id="addBatchEnclosureTagList" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
INSERT INTO tag
(tag_descn,org_id,owner_company,creator_id,create_time,modify_id,modify_time)
SELECT * from
<foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
(SELECT #{item.tagName} as tagName,#{item.orgId} as orgId,
#{item.ownerCompany} as ownerCompany,#{item.creatorId} as creatorId,
#{item.createTime} as createTime,#{item.modifyId} as modifyId,#{item.modifyTime} as modifyTime
FROM DUAL)
</foreach> b
</insert>
<!-- 批處理添加資源與標籤相關的關係表 記錄 -->
<insert id="addBatchEnclosureTagRelationList" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
INSERT INTO course_enclosure_tag
(resource_id,tag_id,org_id,owner_company,creator_id,create_time,modify_id,modify_time)
SELECT * from
<foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
(SELECT #{item.resourceId} as resourceId,#{item.tagId} as tagId,
#{item.orgId} as orgId,#{item.ownerCompany} as ownerCompany,#{item.creatorId} as creatorId,
#{item.createTime} as createTime,#{item.modifyId} as modifyId,#{item.modifyTime} as modifyTime
FROM DUAL)
</foreach> b
</insert>
<!-- 批量刪除 課程資源標籤 -->
<delete id="deleteBatchEnclosureTagRelationList" parameterType="hashmap">
delete from course_enclosure_tag where resource_id=#{resourceId} AND tag_id in
<foreach collection="deleteTagIdList" item="tagId" separator="," open="(" close=")">
#{tagId}
</foreach>
</delete>
3、實現成果