2

这可能是一个 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 项怎么办?我在重新排序时遇到了一个大问题。这是我对如何构建数据的想法的问题,还是有一个很好的解决方案来处理这样的排序列?

4

2 回答 2

1

我认为这样做的正确方法是有一个after引用 pageId 的列来说明这是在那之后。尽管这会产生一些复杂的 SQL。或者,只需将顺序从 0、1000、2000 开始,这为插入内容提供了空间。

进行插入的一种方法是将每个order值乘以 2 并加 1——这是一个相当简单的查询。然后你有空间插入,所以你的表变成:

pageId, contentId, position, order

2,      6,        header,   1
2,      1,        header,   3
2,      4,        header,   5

然后您只需插入订单 as(order * 2)就可以保证有空格。

您必须定期折叠编号以停止溢出值 - 但如果您事先检查是否有空格,那么这种情况应该很少见。(您可以使用ROW_NUMBER重新编号)。

如果您可以避免它,我根本不会将 JSON 嵌入数据库中,解析它并将其添加到单独的表中以使您以后的生活更轻松。

于 2013-09-14T07:36:25.187 回答
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 替换为实际位置。)

于 2013-09-14T11:16:58.213 回答