在SQL中保存订单首选项

use*_*034 3 sql database database-design

我试图看看处理以下场景的最佳方法是什么

我有一个叫做用户的表,我有一个叫做项目的表.每个用户可以将多个项目添加到他的帐户.我有另一个表,比如说AssociateItem,它维护用户和项之间的关联.(将UserID链接到ItemID).用户可以拥有多个项目,因此用户和项目之间存在一对多的关系.这些项目的显示顺序很重要,用户可以从UI更改顺序(类似于Netflix队列:).所以我需要一种方法来保存某个地方的订单,让我们说首选表.所以对于每个用户,我可以保存显示顺序.

我想到了一个简单的XML来保存订单.假设用户的帐户中有第1,3和5项,显示顺序为3,5,1.我可以维护xml并在每次用户更改其显示首选项时更改它

<order>
<item>3</item>
<item>5</item>
<item>1</item>
<order>
Run Code Online (Sandbox Code Playgroud)

这似乎是一种笨拙的方式.我不是数据库专家.所以,如果有人能提供更好的解决方案.我真的很感激.对不起,如果情景不是很清楚.

pjp*_*pjp 9

您可以在AssociateItem表上添加订购号.然后,您可以检索此订购号所订购的商品.

例如

TABLE AssociateItem(UserId, ItemId, SortNumber)

SELECT * FROM User U
INNER JOIN AssociateItem AI ON U.UserId = AI.UserID
INNER JOIN Item I ON AI.ItemId = I.ItemId
ORDER BY AI.SortNumber
Run Code Online (Sandbox Code Playgroud)

当您想要移动项目时,杂乱的部分会出现,因为您需要确保数字保持同步.

如果SortNumber是一个整数,那么您将要将以下Items的所有SortNumbers更新为数字+ 1.

您可以通过使用实数来欺骗并避免所有这些更新,并在上一个和下一个项目SortNumbers之间的中点对新项目进行排名.

例如,如果你想在序列的第2位插入一些东西,0,1,2,3你可以给它分配数字0.5给出0, 0.5, 1, 2, 3

如果你想在第2位插入一些新内容,你可以将其指定为0.25给出0, 0.25, 0.5, 1, 2, 3等等.显然,当你没有足够的精度来正确表示数字时,这将停止工作,但对于小的列表应该没问题.