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