我有一个用户资料表。每个用户可以拥有多个资料,而用户可以调整它们在网格中的显示顺序。
有两个表:用户和资料(1:M)。
我向用户表添加了一个orderby
列,其中将包含类似1、2、3的值。
到目前为止,这似乎还不错。但是当用户将最后一条记录的顺序更改为第一条时,我必须遍历所有记录并对它们的值进行递增+1。这对我来说似乎非常丑陋。
这种情况下是否有更方便的解决方案?
我有一个用户资料表。每个用户可以拥有多个资料,而用户可以调整它们在网格中的显示顺序。
有两个表:用户和资料(1:M)。
我向用户表添加了一个orderby
列,其中将包含类似1、2、3的值。
到目前为止,这似乎还不错。但是当用户将最后一条记录的顺序更改为第一条时,我必须遍历所有记录并对它们的值进行递增+1。这对我来说似乎非常丑陋。
这种情况下是否有更方便的解决方案?
在序列中留下空隙或使用十进制而不是整数数据类型。
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
当用户添加个人资料时,将每个新个人资料的排序编号设置为前一个+1000000。例如,开始时:
p1 1000000
p2 2000000
p3 3000000
p1 1000000
p2 2000000
p3 1500000
我认为,你可以在设计中引入链接列表的概念,而不是仅仅在orderby
列中保持顺序。添加一个类似于nextId的列,其中包含链中的下一个个人资料。
当你查询profiles
表时,可以在你的代码(Java、C#等)中对个人资料进行排序。
我认为在订单之间留下空隙的想法很有趣,但我不知道它是否是您问题的“更方便”的解决方案。
我认为您最好只更新您的order by
列。因为您仍然需要确定状态之间移动了哪些行,以及如果两个状态在位置上交换该怎么办(您是先计算第一个的新排序值还是第二个的新排序值)。如果之间的间隔不够大会发生什么?
只需枚举他们放置的顺序并将每个记录更新到该顺序应该不会占用太多数据。