有哪些数据类型用于序数?

时间:2009-06-19 14:54:58

标签: sql sql-server database data-structures

每当我有一些我希望按特定顺序排列的记录/对象时,我通常会创建一个名为Ordinal的字段。

我常常想知道对序数字段使用整数或小数值是否更好。

将对象移动到顺序中的其他位置时需要考虑这一点:

  • 如果使用连续的整数,则必须对所有序数进行一些认真的修改(或者至少是在移动对象的原始位置之前的序数)。

  • 如果使用整数但是将它们分开(可能间隔为1000),那么您只需将序数更改为要移动对象的周围对象之间的中点值即可。如果在某个地方你最终会得到连续的整数,这可能会失败。

  • 如果您使用十进制数字,您可以找到环绕对象的序数的平均值,并将其用于要移动的对象。

  • 也许可以使用字符串,但我可以看到变得非常愚蠢。

我确信还有其他一些我没有想过的考虑因素。 你用了什么?为什么?

6 个答案:

答案 0 :(得分:2)

小数似乎很好地解决了你的问题。由于小数只是基数为10的浮点数,因此实际上有很多数字可用。除非你已经看到过这样的情况,你已经得到了很多数字并且有理由怀疑需要无限数字位数的原因,我会让它骑行。

如果你真的需要一种替代方案而且不需要坚持使用基本数据bype,那么你可以使用tumbler arithmetic。基本思想是它是一个可以在每个位置无限扩展的地方符号。概念上非常简单。

答案 1 :(得分:1)

“如果在某个地方你最终会得到连续的整数,那么这可能会失败。”

对于这个(可能很少见,因此性能不重要)的情况,你可以实现一个再次空出的重新编号方法。当我以前在COMAL中编程时(任何人都知道那种语言?),你可以用行号做这件事。

答案 2 :(得分:0)

我记得这是与上一篇文章类似的问题。它可以在这里找到:

SQL Server Priority Ordering

链接列表仍然有效,但如果您不想跟踪父子关系,这是一个更容易的解决方案。

听起来你想要的是一个链表。这样你总能知道接下来会发生什么,你不必猜测。所以position字段将是指向它后面的对象的指针。

我一直使用任意数字作为位置的问题是它可以迅速降至熵。如果添加更多项目并且数字变为连续等等,如果项目列表改变位置,则很快就会变得无法管理。

要在sql server表中实现此功能,请添加与主键具有相同数据类型的另一个字段。如果该字段为null,则它是列表中的底部元素。如果要在同一个表中存储多个列表,则可能需要添加另一个名为ListID的字段,该字段指定具有相同ListID的所有行属于同一列表。就像这样。

Table:
ID INT
ListID INT
Child INT

Pararent Row For first list:
 1, 1, 2
First Child
 2, 1, 3
Second Child
3, 1, NULL

Parent Row for second list:
4, 2, 5
First Child
5, 2, 6
Second Child
6, 2, NULL

每次添加行时,您可能不得不进行插入和更新,这可能有点单调乏味,但它总是会使列表排成一行。

答案 3 :(得分:0)

我曾经在这种字段中使用十进制类型来对表中的记录进行排序,我们实际上将这些记录暴露给客户,以便他们可以设置自己的订单。虽然听起来很俗气但我们的客户喜欢它;他们发现它非常直观。他们非常迅速地发现他们可以使用像21.5这样的数字来移动21到22之间的东西。

也许是因为他们是会计师。

答案 4 :(得分:0)

我使用整数,只需在需要在订单中间插入新项目时重新排列。由于您可以使用单个更新语句创建必要的间隙,因此它非常简单。但是,我最多只能在几十行的查找表上完成此操作,显然这样做有点差。但我要说的是,如果你需要为大量行解决这个问题,那么维护订单的过程应该是程序化的,这使得数据类型的选择在很大程度上没有实际意义。

答案 5 :(得分:-1)

“特定订单”是否基于表格外的数据?如果是这样,为什么不包括它,以便您可以动态地进行排序?如果它已经在表格中,则添加字段是多余的。