2011-01-11 82 views
0

我需要關於完成以下設計模式的最佳方法的建議。MySQL - 多對多 - 對關係錶行進行加權/排序 - 關係未關聯時重建訂單

我有兩個表,多對多的關係。還有一張表格將它們連接在一起。

tableName: playlist 
    columns: 
    id 
    name 
track 
    columns: 
    id 
    name 
playlist_track 
    playlist_id { onDelete: CASCADE } 
    track_id { onDelete: CASCADE } 
    order_no 

的關係映射器表的示例數據:

Entry1: 
    playlist_id: 1 
    track_id: 1 
    order_no: 1 
Entry2: 
    playlist_id: 1 
    track_id: 2 
    order_no: 2 
Entry3: 
    playlist_id: 1 
    track_id: 3 
    order_no: 3 
Entry4: 
    playlist_id: 1 
    track_id: 4 
    order_no: 4 

當Entry3被刪除時,該項目爲了PLAYLIST_ID:1。將[1,2,4],這將導致在unprettiness。

當物品被移除時,「重建」訂單的最佳方式是什麼?

心目中的替代將是兩者之間:

  1. PHP代碼,獲取播放列表中的所有曲目,並將其重建某種,做的[1,2,3]
  2. MySQL的觸發器這個任務自動地(?)

任何人有一些具體的建議?

回答

2
UPDATE playlist_track 
SET order_no = order_no -1 
WHERE playlist_id = $whatever_id_you_deleted 
AND order_no > $whatever_order_no_was_deleted 

在另一方面,你能想到的order_no作爲某種重量(較重的物品沉底)。然後更新order_no是沒有必要的。取決於你的其他查詢,如果這是適當的。如果您經常遇到諸如「給我播放列表中的下一個項目」或「給我播放列表中的項目n」的疑問,那麼更新可能是值得的。但是如果你通常取得一個完整的播放列表,我不會打擾更新。

如果您更新訂單,您將需要某種自動操作(如觸發器),因爲可以通過刪除播放列表中刪除它們所引用的音軌來刪除項目。

+0

我想觸發器是最簡單的方法,因爲訂單會經常更新。如果一首曲目被刪除,它也會級聯到playlist_track表。使用觸發器可以方便地跳過附加查詢。 – dropson 2011-01-11 21:22:51

1
UPDATE playlist_track SET order_no = order_no - 1 WHERE playlist_id = 3 AND order_no > 3