sql - 在 SQL 中保存顺序首选项

标签 sql database database-design

我正在尝试了解处理以下情况的最佳方法是什么

我有一个名为 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/

相关文章:

用于将库存分配给即将发货的 SQL 查询

sql - distinct vs group by 哪个更好

sql - 递归SQL中的聚合函数

database - MS Access,使用查询名称作为字段默认值

sql - 在 WHERE 语句中使用 OR 进行慢速 JOIN 查询

sql-server - 有关具有庞大数据集的数据库结构的建议

sql - 在 SQL Server 2008 R2 中 - 您可以在数据库图表工具中重命名表吗?

mysql - 如何将两列中的不同值计为一个数字

postgresql - 在 PostgreSQL 中删除跨表的链接数据

mysql - 添加和更新列/使用附加行创建新表