Database 保持当前和未来职位的秩序

Database 保持当前和未来职位的秩序,database,Database,我最近的一个好奇是如何订购一些邮件。我会给你们一个明确的例子,也许是你们大多数人在过去做过的实验之一 Facebook时间线,您可以在任何时间向其添加帖子和事件。在这种情况下,我假设,帖子是按日期排序的。当你为过去添加一个新的状态时,你必须给它指定一个日期,这样就可以很容易地把它们整理好 我想做的是拥有帖子,并可以选择在特定帖子之后添加新帖子。我没有选择添加一个日期,但我必须有一个方法让他们按顺序 因此,如果每个帖子都有一个id和一个日期(创建日期)。如果在两篇文章之间添加了一篇新文章,我不能增

我最近的一个好奇是如何订购一些邮件。我会给你们一个明确的例子,也许是你们大多数人在过去做过的实验之一

Facebook时间线,您可以在任何时间向其添加帖子和事件。在这种情况下,我假设,帖子是按日期排序的。当你为过去添加一个新的状态时,你必须给它指定一个日期,这样就可以很容易地把它们整理好

我想做的是拥有帖子,并可以选择在特定帖子之后添加新帖子。我没有选择添加一个日期,但我必须有一个方法让他们按顺序

因此,如果每个帖子都有一个id和一个日期(创建日期)。如果在两篇文章之间添加了一篇新文章,我不能增加“上面”文章的所有id,这样我就可以根据id进行排序。日期也不一样,因为我将来可以在两篇旧文章之间添加一篇文章


你能想出什么解决办法?我应该按什么标准订购(如果需要,我准备进行一些数据库方案更改)?

如果您不按标准订购(例如,日期),您将需要一些东西来订购。无需使用列Id进行订购,您可以添加一个非
PK
的列,并实现
ordinallposition
功能

因此,当您在末尾插入时,您将获得max
ordinallposition
,然后执行ordinallposition+1。
如果要在其中两个支柱之间插入,请查看两个支柱的序号位置(要在它们之间插入),从这两个支柱的主要部分开始,更新所有序号列中的递增1,然后(现在在
序号位置中有一个“孔”),插入新的序号位置,这将是这两个职位的未成年人+1(这同样是这两个职位的市长)

然后,您将获得按顺序排列的职位:

    Select fields from Posts 
 -- where  your criteria goes here
    order by ordinalPosition
也许你认为这不是一个好方法,因为每次你在另一个之间插入一个帖子,你必须做一个更新——但是DB不是魔术,必须按一些标准来排序。并且必须确保没有具有相同订单id的帖子,因此可能必须添加一些独特的约束或您想要的东西。
你可能不会更新非常旧的帖子,所以我不认为每次你在其他两个帖子之间添加帖子时都会有这么多更新。

好的,还有另一个可能的解决方案。使用两列进行排序:
Order1
是基本顺序,
Order2
是由
Order1
定义的组内顺序。通过设置
Order1
,您可以将您的帖子分配给一些任意组(即从一天或每100篇帖子开始的所有帖子)。在每个组中,根据
Order2
中的值对帖子进行排序

如果必须将新帖子插入某个组,则只需对该特定组中帖子的
Order2
值重新编号,而不是表中的所有帖子

当然,在检索行时,您需要按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
现在,如果要在
F
G
之间插入
X
,则只需对组
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
现在,如果您想在
A
B
之间插入
Z
,您只需在组
Order1=1
中的帖子中重新编号
Order2

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

“我没有选择添加日期”到什么?新帖子?@SamiAkram是的。也许我在那句话里不是很清楚。我的意思是我不能有一个日期,比如脸谱网的时间线分配给一个职位,并考虑它是我应该通过的标准。因为日期的顺序与我想要的顺序不一样。增加我想插入的帖子之后的所有帖子的数量不是太昂贵了吗?也许,这取决于在其他帖子之间插入帖子时你必须“移动”的帖子数量。如果你有200000000篇文章,并且必须在第一篇和第二篇之间插入一篇文章,那么是的。如果你使用其他选项,比如在帖子之间留出空间,那么你可以在另外两个帖子之间插入的帖子数量是有限的,所以我会说这取决于你的需要。你多久会在另外两个之间插入一次帖子?你要把它们放在哪里?在最后一次还是第一次之间?我现在不知道。这完全取决于用户。它可以在开始,在中间,或在结束。这取决于他们,所以你得决定。想一想,如果你要设定一个极限,需要一个大的极限——如果你达到那个极限会发生什么?你必须考虑你的应用程序,你估计你将拥有的用户,以及他们将如何发布。也许你可以选择在两者之间留出一些空间,但你会更快地达到总帖子栏的限制。想想看,你在帖子之间留了10个空格。因此,在3篇文章中,你有数字30。字段数(如果是int)有一个限制,因此您将以10倍的速度达到该限制。你希望达到多少帖子?我想在选择一个模型之前,你需要估计你的应用程序会增长多少。如果我想在a和B之间发布一些东西呢?如果您想在
A
B
之间插入,这只允许使用一级“插入之间”,您只需对组
Order1=1
中的帖子重新编号,而无需触摸其他组中的行。