我有一张pages
的EAV表,其中包含所有网页与其所属books
之间的关系。
我需要能够存储和操纵页面的顺序。
现在显而易见的解决方案是保留页面的页面索引。
+---------+---------+------------+
| page_id | book_id | page_index |
+---------+---------+------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 1 | 4 |
| 5 | 1 | 5 |
| | | |
| 6 | 2 | 1 |
| 7 | 2 | 2 |
| | | |
| 8 | 3 | 1 |
+---------+---------+------------+
但是现在想象你有5000页,你将最后一页移到前面。这意味着你必须将page_index
追加到4999行,我想这可能会变重。
我考虑在MySQL中实现一个链表:
+---------+---------+-----------+-----------+
| page_id | book_id | prev_page | next_page |
+---------+---------+-----------+-----------+
| 1 | 1 | NULL | 2 |
| 2 | 1 | 1 | 3 |
| 3 | 1 | 2 | 4 |
| 4 | 1 | 3 | 5 |
| 5 | 1 | 4 | NULL |
| | | | |
| 6 | 2 | NULL | 7 |
| 7 | 2 | 6 | NULL |
| | | | |
| 8 | 3 | NULL | NULL |
+---------+---------+-----------+-----------+
如果您移动页面,那么您需要更改的是它自己的行以及您交换的页面行。但是,我还需要同时对多行进行排序(并且它们不必位于"行"(它们可以从任何地方挑选出来并组合成一行),并且支持PHP使用此链表方法实现这一点将比使用简单的page_index
实现更复杂。
我还可以在名为books
的{{1}}表中添加一个列,在该表中我可以存储逗号分隔的页面索引数组,这将更容易维护,因为将使用PHP生成新数组而不是MySQL。但我对此犹豫不决,因为MySQL还没有正式支持。这将更像是一场黑客攻击。
我的问题有更好的解决方案吗?