[英]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.