“手动干预排序”的设计与实现

你的记录一般会按某个业务字段排序,比如ID,生成时间等等。

在论坛或SNS系统中,你可能要允许手工调整记录间的排序,比如“置顶一个帖子”,“下沉某个帖子让人感觉它是一个月前发表的”等等。

在设计社区系统的数据库时,你首先要有意识地考虑下某个记录列表是否需要手工排序。如果需要,你应该使用一个专门的字段来解决这个问题。

=============================

下面就说下这个字段(假设它叫 sort_order)相关的设计与实现:

1. 考虑到比较式分页的需求,这个字段的值要像ID一样不能重复。你可以用数据库的序列生成器生成这个字段,也可以像下面将要说的那样,根据一定的编码规则生成这个字段。

2. 如果你设计的是社区系统,那么你的记录的原始排序规则很有可能是“发表时间”;这时“手动干预排序”可能相当于“让人感觉某个帖子是另一个时间点发表的”。 因此,sort_order最好体现时间信息。我的做法是:sort_order = 记录创建时间的毫秒数 串接  3位随机数。 这样基本可以保证唯一,而且携带时间信息。你会问为什么不直接用纳秒数?因为系统生成纳秒数需要1毫秒以上的时延,对性能伤害很大。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.