【问题标题】:How to store a checklist with ordered items on the DB如何在数据库上存储带有订购项目的清单
【发布时间】:2018-10-13 05:19:07
【问题描述】:

我需要在 MySql 数据库中存储一些清单。事实证明这比预期的要棘手:

  • 有一个适用于所有事物的“主”清单
  • 每个端口都将参考主清单,但在特定位置散布了额外的项目

我最初的想法是有一个带有字段的checklists 表:

  • 身份证
  • 说明
  • portId(如果是“常规”清单中的项目,则为 null)
  • 位置

在这里,“主”清单将是“portId”设置为空的项目,特定端口的清单将是那些将 portId 设置为某个值的项目。 然而,排序东西充其量是棘手的:“位置”参数是模棱两可的,因为它可能指的是特定于端口的列表的位置,但是重新排序“主要”(非端口)项目会很糟糕。

另一个选项是链表:

  • 身份证
  • 说明
  • portId(如果是“常规”清单中的项目,则为 null)
  • previousId

这意味着每个项目都知道“父母”是谁。 这似乎是完美的解决方案。但是......查询存在一个问题:您如何编写查询以使项目以正确的顺序出现? (即首先是没有任何 id 的那个,然后是第一个以第一条记录作为其父项的项,依此类推)。另外,如果出现任何问题,我担心会破坏链接列表。

是否有针对此类问题的“最佳实践”?

【问题讨论】:

  • 这里的“端口”是什么意思?
  • 哦,这只是额外项目适用的港口(如海港)。它基本上是一个 ID,指定该特定项目不是“通用”项目,而是特定于该端口
  • 我在这里,有 20 年的开发经验,但我就是找不到正确的方法来解决这个问题。每次想到解决办法,我就自动不喜欢了……
  • position 字段用法不清楚 - 是否应该按 portId 编号/排序?在您的第一个架构中使用纯 select ... order by portId asc, position asc 有什么问题?
  • 如果您担心链表的完整性,您可以将其替换为嵌套集方法或与嵌套集方法结合使用,但会降低插入/删除速度和更复杂的数据管理。

标签: mysql sql


【解决方案1】:

答案如此简单,令人尴尬。 我从错误的角度处理问题,并陷入困境。 与其将问题视为“单独的清单然后合并”,不如将其视为“可能会过滤掉项目的一个大清单”。

这样,我可以简单地应用通常的“定义记录顺序的每个字段一个权重”(当您有一个有序集时总是这样做);然后,我将简单地“过滤掉”一些不适用的字段。过滤可以通过多种方式进行,但这超出了我的问题范围。

一旦从正确的角度面对问题,它就会变得非常简单明了。

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    相关资源
    最近更新 更多