2009-06-19 152 views
2

每当我有一些记录/对象,我想按某种顺序,我通常会创建一个名为Ordinal的字段。哪些数据类型用于序号?

我经常想知道对序号字段使用整数还是小数值会更好。

这是一个考虑移动对象在顺序中的不同位置时:

  • 如果使用连续的整数,你要做的所有的序数的(或至少是一些严重的返工在被移动的对象的原始位置之前的序列)。

  • 如果使用整数但将其间隔(可能为1000个间隔),则可以将序号更改为要移动对象的周围对象之间的中点值。这可能会失败,如果在最后的连续整数结束的地方。

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

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

我确定还有其他因素我没有想过。 你使用什么,为什么?

+0

我刚刚发现了一个类似的问题。查看我的更新链接。 – kemiller2002 2009-06-21 12:27:23

回答

1

“这可能会失败,如果某个地方你最后连续的整数。”

对于这种情况(可能是罕见的,因此不是性能重要)的情况下,您可以实现一个重新编号的方法,它可以再次隔开。当我用COMAL进行编程时(任何人都知道那种语言?),你可以用行号来做这件事。

0

我记得这是一个类似的问题,以前的帖子。它可以在这里找到:

SQL Server Priority Ordering

链表,仍能正常工作,但这是一个更容易的解决方案,如果你不想跟踪父子关系。

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

我一直在使用任意数字来表示位置的问题是,它可能会很快下降到熵。如果更多的项目被添加并且数字变得连续,等等等等。如果项目列表改变位置,它可能很快变得难以管理。

要在sql server表中实现这个,请添加与主键具有相同数据类型的另一个字段。如果该字段为空,则它是列表中的底部元素。如果要在同一个表中存储多个列表,则可能需要添加另一个名为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 

你可能需要做的每次添加行,它可以是一个有点乏味时间的插入和更新,但它总会让列表排队。

+0

有趣。对我来说这是一个新概念。你将如何在SQL Server数据库中实现这一点? – 2009-06-19 15:39:45

0

我曾经为这种类型的字段使用小数类型来在表中排序记录,我们实际向客户公开了这些记录,以便他们可以设置自己的订单。虽然听起来很俗气,但我们的客户喜欢它;他们发现它非常直观。他们很快就发现他们可以使用21.5这样的数字在21到22之间移动。

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

-1

基于表外数据的“特定顺序”?如果是这样,为什么不包含它,所以你可以动态地进行排序?如果它已经在表格中,添加一个字段是多余的。

2

小数似乎很好地解决了你的问题。由于小数只是10个浮点数,所以实际上有很多可用的数字。除非你已经看到了你已经出现在不少位数的情况,并且有理由怀疑无限数量的数字是必要的理由,否则我会让它骑。

如果您确实需要替代方案,但没有看到需要坚持使用基本数据,则可以使用tumbler arithmetic。基本的想法是,它是在每个位置无限可扩展的地方符号。在概念上很简单。

0

我使用整数,只需在需要在订单中插入新项目时重新排列。由于您可以通过单个更新语句创建必要的差距,因此它相当简单。但是,我只在最多几十行的查找表上完成了这个工作,显然这比较糟糕。但是我想说,如果你需要为大量行解决这个问题,维护订单的过程应该是程序化的,这使得数据类型的选择在很大程度上是没有意义的。

相关问题