这可能是x/y问题,所以如果有更好的方法,我很乐意听到。问题的摘要从最后一个代码块开始,如果需要,请跳到该代码块,如果需要,请返回到详细信息。
我正在建立一个内容管理器(如果没有其他的,为经验)。为了开始了解我需要的数据,我制作了一个具有以下结构的“pages”表:
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”的content字段中的db中,因为如果我删除内容项“5”,它仍然在该页面的json中。我需要能够删除内容项5,它将自动从任何使用它的地方删除。
这让我想到:
我创建了另一个表,跟踪内容项的使用位置和顺序。下面是该表的结构(内容位置):
pageId (what page this content is on) | contentId (which content) | position | order
所以,我认为这让我走上了删除东西的正确轨道。。。如果我删除了一个页面,我相信我可以将其设置为删除其在内容位置中的行,并将其设置为删除内容项将删除该项的内容位置行。我真的还没试过,但我很肯定那是可能的。如果不是,我真的迷路了:)
我的主要问题似乎是订货。考虑这组数据:
pageId, contentId, position, order
2, 6, header, 0
2, 1, header, 1
2, 4, header, 2
如何插入第一个项目(不能在0之前插入),或者如果我想插入其中一个项目(11/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 - MYSQL数据库-如何显示存储订单项的“订单”列-应按另一列分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18797433/