在開發過程中,我遇見這麼一個問題:在資料庫中有一張文章表,用以儲存文章的相關資訊(如:標題、內容、作者、創作時間、
收藏數等),還有另外一張表用以儲存使用者和文章的收藏關係(主要欄位有:使用者ID、文章ID),在有初次查看該文章時從資料庫擷取到文章資料後會將資料緩衝到redis中,由此提高效能。
但現在因為每次收藏或移除最愛文章時都會更新文章表的
收藏數這一欄位,並且都會清空該文章的緩衝(之所以選擇清空而不是更新緩衝,是為了避免產生髒資料),下次訪問該文章時又會查詢資料庫並快取資料,因此會對效能造成一定影響!
因此我決定將文章表的收藏數拆分出來建立一張文章收藏數表(主要欄位有:主鍵id,文章ID,收藏數),並且緩衝文章資料時將收藏數分開緩衝,這樣,每次收藏或移除最愛文章時文章表不用更新,只更新文章收藏數表,更新文章收藏數表後,直接更新緩衝(這兒之所以不怕產生髒資料是因為收藏數不是特別重要的資料,就算有一定誤差也不會造成惡劣影響)。
使用以上方案,由此產生兩個疑問,希望得到大家的解答:
因為文章收藏數中主鍵ID和文章ID兩個欄位都是唯一不重複的欄位,是否可以不要主鍵ID欄位,直接將文章ID當做主鍵?
因為如果每次新增一條文章資料時沒有同步新增一條對應文章ID的文章收藏數資料,那麼每次收藏與移除最愛文章時更新文章收藏數,都會需要先查詢文章收藏數表中是否已經存在對應文章ID的收藏數,如果沒有就新增一條文章收藏數資料,如果有就直接更新該文章的收藏數,所以,為了簡便,我決定每次新增一條文章資料時都同步新增一條對應文章ID的文章收藏數資料,以後更新文章收藏數時就不需要先判斷資料是否存在,而可以直接更新資料,在這種情況下,要怎麼避免新增文章資料和新增文章收藏數資料之間出現異常導致新增文章資料成功而新增文章收藏數資料失敗的情況?我知道可以使用事務來避免,可以有沒有更簡單的方法呢?MySQL可不可以新增一條資料的同時自動在另一張表裡新增一條資料?(資料庫渣~)
以上,致謝!
回複內容:
在開發過程中,我遇見這麼一個問題:在資料庫中有一張文章表,用以儲存文章的相關資訊(如:標題、內容、作者、創作時間、收藏數等),還有另外一張表用以儲存使用者和文章的收藏關係(主要欄位有:使用者ID、文章ID),在有初次查看該文章時從資料庫擷取到文章資料後會將資料緩衝到redis中,由此提高效能。
但現在因為每次收藏或移除最愛文章時都會更新文章表的收藏數這一欄位,並且都會清空該文章的緩衝(之所以選擇清空而不是更新緩衝,是為了避免產生髒資料),下次訪問該文章時又會查詢資料庫並快取資料,因此會對效能造成一定影響!
因此我決定將文章表的收藏數拆分出來建立一張文章收藏數表(主要欄位有:主鍵id,文章ID,收藏數),並且緩衝文章資料時將收藏數分開緩衝,這樣,每次收藏或移除最愛文章時文章表不用更新,只更新文章收藏數表,更新文章收藏數表後,直接更新緩衝(這兒之所以不怕產生髒資料是因為收藏數不是特別重要的資料,就算有一定誤差也不會造成惡劣影響)。
使用以上方案,由此產生兩個疑問,希望得到大家的解答:
因為文章收藏數中主鍵ID和文章ID兩個欄位都是唯一不重複的欄位,是否可以不要主鍵ID欄位,直接將文章ID當做主鍵?
因為如果每次新增一條文章資料時沒有同步新增一條對應文章ID的文章收藏數資料,那麼每次收藏與移除最愛文章時更新文章收藏數,都會需要先查詢文章收藏數表中是否已經存在對應文章ID的收藏數,如果沒有就新增一條文章收藏數資料,如果有就直接更新該文章的收藏數,所以,為了簡便,我決定每次新增一條文章資料時都同步新增一條對應文章ID的文章收藏數資料,以後更新文章收藏數時就不需要先判斷資料是否存在,而可以直接更新資料,在這種情況下,要怎麼避免新增文章資料和新增文章收藏數資料之間出現異常導致新增文章資料成功而新增文章收藏數資料失敗的情況?我知道可以使用事務來避免,可以有沒有更簡單的方法呢?MySQL可不可以新增一條資料的同時自動在另一張表裡新增一條資料?(資料庫渣~)
以上,致謝!
1.可以,但這裡你需要做一個聯動就是在增刪文章的時候也要對文章收藏數表進行操作
2使用mysql的udf,詳情請看MySQL :: MySQL 5.1 Reference Manual :: 22.3 Adding New Functions to MySQL 然後通過trigger在文章表delete和insert之後進行函數的調用,寫入到文章收藏數表中去。大致是這個樣子。