【问题标题】:What is the best way to store the order between rows in the database? [closed]在数据库中存储行之间的顺序的最佳方法是什么? [关闭]
【发布时间】:2010-11-12 04:26:06
【问题描述】:

我正在克隆和扩展 Google Tasks 应用程序。我希望能够存储行顺序。我在数据库中创建了一个名为 rowNumber 的字段。当用户在其他行中间插入一行时,我必须在许多其他行中更新此字段以实现所需的输出。有更好的方法吗?

顺便说一句,该应用程序是为 Google AppEngine (Python) 制作的。

【问题讨论】:

  • 行必须加一吗?如果删除一行会发生什么?您是否也对剩余的行重新编号?
  • 行不一定递增一。我知道你想从哪里得到:如果增量更高,我们可以插入行而不更新其余行。
  • 如果你删除了一行,剩下的仍然是有序的。
  • 一个非常相关的问题:stackoverflow.com/questions/495390/…

标签: database-design


【解决方案1】:

将 rowNumber 设为浮点数。当用户在行 xy 之间插入时,新行得到 rowNumber = (x.rowNumber + y.rowNumer) / 2。

当你想移动一行时,只需根据目标位置以同样的方式更新它的 rowNumber 即可。

新行获取 rowNumber 例如。最大 + 256。

编辑 Microsoft 在 SQL Server 2008 中使用新的 HierarchyId 数据类型解决了这个问题。您可以几乎在 2 个项目之间插入任意次数 - 直到用完 HierarchyId 最大大小。

【讨论】:

  • 我不建议为此使用浮点数。它只是让您更难预测到达两个相邻值的点,即 a 和 b,使得 (a + b)/2 等于 a 或 b。您需要检测这种情况并做一些特别的事情。因此,您可以像使用浮点数一样以 256(或更大的数字)间隔开始使用整数,并且使用整数更容易在整个类型范围内“均匀地”分隔值。跨度>
  • 没错,这种情况总是会发生,例如。在同一位置插入 50 次后(使用高精度小数作为 rowNumber)。我忽略了这一点。达到限制时使用整数并重新计算整个表会更好。
【解决方案2】:

一个选项可能是将行存储为链表,其中每一行为下一行和上一行保留一个附加字段。这样做的好处是它只需要在插入后触摸另外两行。缺点是,(据我了解)AppEngine 没有连接,因此一次查询多于一行将非常难看。

【讨论】:

  • 即使在 SQL 中查询也会很丑,对吧?
  • 而且即使可以查询,也可能不会很快,对吗?
  • 取决于你对丑陋 SQL 的看法。 sql 查询将只是一堆连接(等于您希望返回的行数少一个),将一行的下一行等同于后续行的 pk。速度取决于 DBMS 对此类查询的优化程度。
  • 您可以在客户端查询无序并进行排序...
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2016-08-09
  • 2011-10-11
  • 2021-05-06
相关资源
最近更新 更多