2

这些天我的好奇心之一是如何订购一些帖子。我会给你一个明确的例子,也许你们中的大多数人过去都做过实验。

Facebook 时间线,您可以在任何时间点向其中添加帖子和事件。在这种情况下,我假设帖子按日期排序。当您为过去添加新状态时,您必须为其分配一个日期,因此很容易将它们按顺序排列。

我想要做的是发布帖子以及在特定帖子之后添加新帖子的选项。我没有添加日期的选项,但我必须有办法按该顺序获取它们。

因此,如果每个帖子都有一个 id 和一个日期(创建日期)。如果在 2 个帖子之间添加了一个新帖子,我不能增加“上层”帖子的所有 id,以便我可以按 id 排序。日期也不是,因为我以后可以在两个较旧的帖子之间添加一个帖子。

您对此有何设想?我应该按照什么标准订购(如果需要,我准备好对数据库方案进行一些更改)?

4

2 回答 2

2

好的,还有另一种可能的解决方案。使用两列进行排序:Order1是基本顺序,并且Order2是由 定义的组内的顺序Order1。您可以通过设置将您的帖子分配到一些任意组(即一天或每 100 个帖子的所有帖子)Order1。在每个组内,帖子根据 中的值排序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仅对 group 中的项目重新编号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并且ABOrder2在 group 的帖子中重新编号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
于 2012-08-25T17:10:32.890 回答
1

如果您不按标准(Date例如 )进行排序,您将需要一些东西来订购它们。不必使用列 Id 来订购,您可以添加一个不是 的列PK,并生成 的功能ordinalPosition

因此,当您在最后插入时,您将获得 max ordinalPosition,然后执行 ordinalPosition+1。如果您想在其中两个之间插入,那么您查看您拥有的两个帖子的序数位置(在它们之间插入),从这两个帖子的主要部分更新所有 ordinalColumns 中的 1,然后(现在您得到了中的一个“洞” ordinalPosition,插入新的 ordinalPosition,这将是这两个职位的次要 + 1(这同样是这两个职位的市长)

然后,您将获得按您的 ordinalPosition 排序的帖子:

    Select fields from Posts 
 -- where  your criteria goes here
    order by ordinalPosition

也许您认为这不是一个好方法,因为每次您在另外两个之间插入一个帖子时,您都必须进行更新 - 但 Db 并不神奇,必须按照某些标准进行排序。并且必须确保没有具有相同订单 ID 的帖子,因此可能必须添加一些唯一约束或您想要的东西。您可能不会更新非常旧的帖子,所以我认为每次您在其他两个之间添加帖子时不会有这么多的更新。

于 2012-08-25T14:31:30.783 回答