代码之家  ›  专栏  ›  技术社区  ›  Ronnie Overby

用于序数的数据类型是什么?

  •  2
  • Ronnie Overby  · 技术社区  · 15 年前

    每当我有一些记录/对象想要按一定顺序排列时,我通常创建一个名为ordinal的字段。

    我经常想知道对序数字段使用一个整数还是一个十进制值比较好。

    这是按顺序将对象移动到不同位置时的考虑因素:

    • 如果使用连续整数,则必须对所有序数(或至少在移动对象的原始位置之前落下的序数)进行一些严重的改写。

    • 如果使用整数,但将它们隔开(可能间隔1000次),那么只需将序号更改为要移动对象的周围对象之间的中点值。如果一行中的某个地方以连续整数结尾,则此操作可能失败。

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

    • 也许可以用一根绳子,但我可以看到它变得非常愚蠢。

    我肯定还有其他我没想到的因素。 你用什么?为什么?

    6 回复  |  直到 8 年前
        1
  •  1
  •   balpha    15 年前

    “如果行的某个地方以连续整数结尾,则此操作可能失败。”

    对于这种情况(可能很少见,因此性能不重要),您可以实现一个重新编号的方法,该方法会再次出现空格。当我用Comal编程时(有人知道那种语言吗?),您可以对行号执行此操作。

        2
  •  2
  •   PanCrit    15 年前

    小数似乎能很好地解决你的问题。因为小数是以10为基数的浮点数,所以实际上有很多数字可用。除非你看到过这样的情况,你已经得到了相当多的数字,并有理由怀疑一个原因,无限的数字是必要的,我会让它骑。

    如果您真的需要一个替代方案,并且不认为需要坚持使用基本数据bype,那么您可以使用 tumbler arithmetic . 其基本思想是它是一个位置符号,在每个位置都可以无限扩展。概念上相当简单。

        3
  •  0
  •   Robert Harvey    15 年前

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

    也许是因为他们是会计。

        4
  •  0
  •   Noah Yetter    15 年前

    我使用整数,当需要将一个新项插入到顺序的中间时,只需根据需要重新排列。因为您可以用一条update语句来创建必要的间隙,所以这非常简单。不过,我只在最多几十行的查阅表格上做过这个工作,显然这个范围有点小。但是我要说的是,如果您需要针对大量行的这个问题的解决方案,那么维护顺序的过程应该是程序化的,这使得数据类型的选择在很大程度上是没有意义的。

        5
  •  0
  •   Community uzul    7 年前

    我记得这是一个类似于前一篇文章的问题。可以在这里找到:

    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
    

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

        6
  •  -1
  •   l0b0    15 年前

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