我正在尝试了解处理以下情况的最佳方法是什么
我有一个名为 User 的表,还有一个名为 items 的表。每个用户可以将多个项目添加到他的帐户中。我有另一个表,假设是 AssociateItem,它维护用户和项目之间的关联。 (将 UserID 链接到 ItemID)。一个用户可以有多个项目,因此用户和项目之间存在一对多的关系。这些项目的显示顺序很重要,用户可以从 UI 更改顺序(有点像 Netflix Queue :))。所以我需要一种方法将订单保存在某个地方,比如偏好表。所以我可以为每个用户保存显示顺序。
我想到了一个简单的 XML 来保存订单。假设用户的帐户中有项目 1、3 和 5,显示顺序为 3、5、1。我可以维护一个 xml 并在每次用户更改其显示首选项时更改它
<order>
<item>3</item>
<item>5</item>
<item>1</item>
<order>
这样做似乎很笨拙。我不是数据库专家。因此,如果有人可以提供更好的解决方案。我真的很感激。抱歉,如果场景不是很清楚。
最佳答案
您可以在 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
当您想要移动项目时,麻烦的部分就来了,因为您需要确保数字保持同步。
如果 SortNumber 是一个整数,那么您需要将以下项目的所有 SortNumbers 更新为数字 + 1。
您可以作弊并避免所有这些更新,方法是使用实数并将新项目排在前一个和下一个项目 SortNumbers 之间的中点。
例如如果你想在序列 0,1,2,3
的位置 2 插入一些东西,你可以给它分配数字 0.5 给出 0, 0.5, 1, 2, 3
如果您随后想在位置 2 插入一些新内容,您可以将其指定为 0.25,给出 0, 0.25, 0.5, 1, 2, 3
等。显然,这将在某个时候停止工作您没有足够的精度来正确表示数字,但对于较小的列表应该没问题。
关于sql - 在 SQL 中保存顺序首选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1861207/