MYSQL 数据库 - 如何使用存储应显示的订单项目的 "order"列 - 按另一列分组

标签 mysql sql database-design data-structures

这可能是由 x/y 问题引起的,所以如果有更好的方法,我很乐意听到。问题的摘要从最后一个代码块开始,因此如果您愿意,请跳到该代码块,并在需要时返回详细信息。

我正在构建一个内容管理器(如果没有别的,就是为了体验)。为了开始了解我需要什么数据,我制作了一个具有以下结构的“页面”表:

id (page id) | path (where it is found) | title | content  | (etc.. some other stuff)

所以,问题出在内容方面。让我解释一下最终结果:我需要一个包含位置对象的内容映射,每个位置都是属于该位置的内容数组。这是一个示例:

{ header: [5], main: [4,1], footer: [2,8,9] }

然后,这些 id 将转到内容表,提取每个项目(如 id 5),并将 id 替换为该项目的实际内容/设置。目前这还不太重要。

我不能将 json 直接存储到“pages”的内容字段中的数据库,因为如果我要删除内容项“5”,它仍然会位于该页面的 json 中。我需要能够删除内容项 5,并且它会自动从使用的地方删除。

这让我想到了这一点:

我创建了另一个表来跟踪内容项的使用位置和顺序。以下是该表的结构 (content_locations):

pageId (what page this content is on) | contentId (which content) | position | order

所以,我认为这让我走上了能够删除内容的正确轨道...如果我删除一个页面,我相信我可以将其设置为删除其在 content_locations 中的行,并将其设置为删除内容项目将删除该项目的 content_locations 行。老实说,我还没有尝试过,但我很确定这是可能的。如果没有,我真的迷路了:)

我的主要问题似乎是排序。考虑这组数据:

pageId, contentId, position, order

2,      6,        header,   0
2,      1,        header,   1
2,      4,        header,   2

如何插入第一个项目(不能在 0 之前插入),或者如果我想在其中一个项目 (1 1/2) 之间插入怎么办,或者如果我删除了项目 1 怎么办?我在重新排序时遇到了一个大问题。这是我关于如何构造数据的想法的问题吗?还是有一个好的解决方案来处理这样的排序列?

最佳答案

尽管有其他问题,我只会评论重新排序......

如果您需要腾出空间来插入新行,您可以通过以下方式轻松移开其他行:

UPDATE your_table
SET order = order + 1
WHERE pageId = ... AND order > 0

(将 0 替换为您要插入新行的实际位置。)

删除后您可以执行相反的操作,或者您可以只留下一个洞 - 这些洞可以在演示级别轻松“折叠”。

除非每页有大量行,否则这应该相当快。如果没有,请考虑提前留下孔,仅在孔完全填满时才移动元素。

顺便说一句,要切换两行,您可以执行以下操作:

UPDATE your_table 
SET order =
    CASE order 
    WHEN 2 THEN 3
    WHEN 3 THEN 2
    END
WHERE pageId = ... AND order IN (2, 3)

(将 2 和 3 替换为实际位置。)

关于MYSQL 数据库 - 如何使用存储应显示的订单项目的 "order"列 - 按另一列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18797433/

相关文章:

mysql - 在数据库中做灵活列的正确方法是什么?

java - 准备语句的 SQL 语法错误?

php - 对数据库中的用户 'timeline' 事件进行建模的最佳方法

python - 使用python从sql中提取数据,进行转换并写回sql表

c# - 在数据库中保存类类型的最佳方法?

postgresql - 我真的需要为我的三种类型的用户提供单独的表吗?

php - 如何选择按日期分组的 SQL 结果

mysql - 使用 ORDER BY id DESC 在 Max Date 值上进行 LEFT JOIN

php - 字段列表中的列 'id' 在 PHP 中不明确

sql - Oracle SQL : Finding common subjects taken by students in each class