繁体   English   中英

什么是在SQL中存储记录顺序的最佳方法

[英]What would be the best way to store records order in SQL

我有一个用户配置文件表。 每个用户都可以拥有许多配置文件,并且用户可以排列它们在网格中的显示顺序。

共有2个表用户和个人资料(1:M)

我已经将一个orderby列添加到Users表中,其中的值将是1,2,3 ..

到目前为止似乎还可以。 但是当用户将最后一条记录的顺序更改为第一条记录时,我必须完成所有记录并将其值增加+1。 这在我看来非常难看。

对于这种情况,有没有更方便的解决方案?

在序列中留下间隙或使用小数而不是整数数据类型。

如何按列使用浮点数? 这样,您可以随时在两个其他人之间挤压配置文件,而无需更改这两个值。 例如,如果我想在配置文件B(订单值1)和C(订单值2)之间放置配置文件A,我可以将订单值1.5分配给A.要将它放在顶部,在顶部用于使ordervalue为1之前的位置,您可以使用订单价值0.5

没有理由为orderby设置整数,没有理由在配置文件的顺序之间增加1。

最好的解决方案是反映功能的解决方案,这是一个简单的整数列表。 保持列表顺序只是几个SQL语句,比其他解决方案建议更容易理解(浮点数,有缺口的整数)。

如果您的列表非常大(数万个),那么性能考虑因素可能会发挥作用,但我认为这些列表并不长。

当用户添加配置文件时,将每个新配置文件的订购号设置为前一个+1000000。 例如,从以下开始:

p1   1000000
p2   2000000
p3   3000000

重新排序时,将配置文件的顺序设置为它们之间的两个中间位置:

p1   1000000
p2   2000000
p3   1500000

这给出了阶数p1,p3,p2

如果数据集很小(似乎是这种情况),我宁愿使用正常的整数列表,并在配置文件获得新位置时批量更新它们。 这更好地反映了应用程序功能。

在Sql Server中,对于下表User_Profiles (user_id, profile_id, position) ,我会有这样的事情:

--# The variables are: 
--#   @user_id - id of the user
--#   @profile_id - id of the profile to change
--#   @new_position - new position that the profile will take
--#   @old_position - current position of the profile 

select @old_position = position 
from User_Profiles where 
user_id = @user_id and profile_id = @profile_id

update p set position = pp.new_position
from User_Profiles p join (
  select user_id, profile_id,
    case 
    when position = @old_position then @new_position 
    when @new_position > @old_position then --# move up
      case 
      when @old_position < position and 
           position <= @new_position 
      then position - 1
      else position
      end
    when @new_position < @old_position then --# move down
      case 
      when position < @old_position and 
           @new_position <= position 
      then position + 1
      else position
      end
    else position --# the same
    end as new_position
  from User_Profiles p where user_id = @user_id
) as pp on 
p.user_id = pp.user_id and p.profile_id = pp.profile_id

我认为在订单之间留下空白的想法很有意思,但我不知道它是否是一个“更方便”的解决方案。

我认为你最好只order by列更新order by 因为您仍然需要确定状态在哪些行之间移动,以及如果两个状态切换到位,该怎么办(您是按第一个计算新订单的值,还是第二个计算新订单)。 如果两者之间的差距不够大会怎么样?

数据密集不应只是枚举它们放入的顺序并将每条记录更新到订单。

我认为不是在orderby列中保持顺序,而是可以将linklist概念引入到您的设计中。 添加像nextId这样的列,它将包含链中的下一个配置文件。 查询profiles表时,您可以在代码中对配置文件进行排序(java,C#等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM