MySQL - 多对多 - 对关系表行进行加权/排序 - 关系未关联时重建订单
问题描述:
我需要关于完成以下设计模式的最佳方法的建议。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。
当物品被移除时,“重建”订单的最佳方式是什么?
心目中的替代将是两者之间:
- PHP代码,获取播放列表中的所有曲目,并将其重建某种,做的[1,2,3]
- MySQL的触发器这个任务自动地(?)
任何人有一些具体的建议?
答
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
”的疑问,那么更新可能是值得的。但是如果你通常取得一个完整的播放列表,我不会打扰更新。
如果您更新订单,您将需要某种自动操作(如触发器),因为可以通过删除播放列表中删除它们所引用的音轨来删除项目。
答
UPDATE playlist_track SET order_no = order_no - 1 WHERE playlist_id = 3 AND order_no > 3
我想触发器是最简单的方法,因为订单会经常更新。如果一首曲目被删除,它也会级联到playlist_track表。使用触发器可以方便地跳过附加查询。 – dropson 2011-01-11 21:22:51