2014-04-08 20 views
1

我需要改变显示行的顺序到我的脚本管理页面的能力。
因为新添加的行存在默认顺序(转到列表的末尾),并且管理员应该可以更改特定行的位置。
我打算像行双链表一样行,以便能够重新定位行。在mysql中存储行顺序

  • 可以使用链表方法保存mysql行的显示位置吗?
  • 有没有更好的方法?
  • 我应该使用单独的表来存储订单吗,或者可以将两个next & prev列添加到原始表中吗?
  • 这是possibe然后使用mysql order语句与此方法吗?

编辑:我也想过用间隔顺序码(如0,100,200,...),但是这有可能达到

+0

有多少行,你希望有?例如,链接列表方法在精简时构建起来很复杂,但需要更多的权力来用新订单更新所有行。如果您的行数不多,则可以使用一个简单的列来存储每个作品的当前排序顺序,并且每次订单更改时都会批量更新它们(所有受影响的那些> =更改)。 –

+0

@MichaelBerkowski:可以有超过一百万行 – RYN

+1

百万是很多总是批量更新......但它也似乎是一个不合理的大数额手动订购。链接列表的问题并不是存储它,而是查询它并获得正确的订单。 –

回答

1

我想你会得到更好的限制只需将订购位置存储在专用字段中,而不是尝试实施链接列表。

链接列表的问题是,需要某种列表遍历才能将订单显示给用户,以“重建”订单。通常情况下,您会使用递归查询来做到这一点,但不幸的是MySQL不支持递归查询,所以您需要摆弄存储过程,或者最终为每个列表进行数据库往返节点。

总而言之,只要不时更新几行的订单字段(当您需要重新订购时),可能比每次(当您需要显示时)遍历列表都要便宜,尤其是如果您主要移动行距小的距离。如果你引入了差距(就像你已经提到过的那样),那么你实际需要更新的行数会大幅度下降,但这是以复杂性增加为代价的。

您也可以将订单字段载入由InnoDB提供的clustering机制。

因人而异,当然,但我会建议试图实现什么更复杂的前标杆代表性数据量的简单订单字段的方法...