这些天我的一个好奇心是如何订购一些帖子。我会给你一个明确的例子,也许是过去你实验过的大多数人。
Facebook时间线,您可以在任何时间点添加帖子和事件。在这种情况下,我假设,帖子按日期排序。当您为过去添加新状态时,您必须为其指定日期,因此很容易将它们按顺序排列。
我想要做的是发布帖子以及在特定帖子之后添加新帖子的选项。我没有选择添加日期,但我必须有办法按顺序获取它们。
所以,如果每个帖子都有一个id和一个日期(创建日期)。如果在2个帖子之间添加了新帖子,我无法增加“上”帖子的所有ID,以便我可以通过id进行排序。也不是日期,因为我可以在将来的两个旧帖子之间添加帖子。
您对此有何想法?我应该订购什么标准(如果需要,我准备进行一些数据库方案更改)?
答案 0 :(得分:2)
好的,还有另一种可能的解决方案。使用两列进行排序:Order1
是基本订单,Order2
是由Order1
定义的组内的订单。您可以通过设置Order1
将您的帖子分配给某些任意组(即每天或每100个帖子中的所有帖子)。在每个组中,帖子根据Order2
中的值进行排序。
如果必须将新帖子插入某个组,您只需要为此特定组中的帖子重新设置Order2
值,而不是表格中的所有帖子。
当然,在检索行order by Order1, Order2
。
所以你的表看起来像这样:
PostName Order1 Order2
------------------------
A 1 1
B 1 2
C 1 3
D 1 4
E 2 1
F 2 2
G 2 3
现在,如果您想在X
和F
之间插入G
,则只对组Order1 = 2
中的项重新编号,以便行成为:
PostName Order1 Order2
------------------------
A 1 1
B 1 2
C 1 3
D 1 4
E 2 1
F 2 2
G 2 4
X 2 3
现在,如果您想在Z
和A
之间插入B
,则只需在Order2
组的帖子中重新编号Order1 = 1
:
PostName Order1 Order2
------------------------
A 1 1
B 1 3
C 1 4
D 1 5
E 2 1
F 2 2
G 2 4
X 2 3
Z 1 2
答案 1 :(得分:1)
如果您没有按标准(例如Date
)进行订购,则需要订购一些东西。没有必要使用列ID来订购,您可以添加不是PK
的列,并使ordinalPosition
的函数。
因此,当您在最后插入时,您将获得最大ordinalPosition
,然后执行ordinalPosition + 1。
如果你想在其中两个之间插入,那么你看看你所拥有的两个帖子的顺序位置(在它们之间插入),更新1个所有ordinalColumns的增量,从这两个帖子的主要部分,然后(现在你得到) ordinalPosition
中的“洞”,插入新的ordinalPosition,这将是那两个帖子+ 1的次要(同样是这两个帖子的市长)
然后,您将获得ordinalPosition订购的帖子:
Select fields from Posts
-- where your criteria goes here
order by ordinalPosition
也许您认为这不是一个好方法,因为每当您在另外两个之间插入帖子时,您将不得不进行更新 - 但Db不是魔术,必须按某些标准排序。并且必须确保没有具有相同订单ID的帖子,因此可能需要添加一些Unique Constraint或其他任何内容。 你可能不会更新很旧的帖子,所以每次你在其他两个帖子之间添加帖子时我都不会想到这么多的更新。