【发布时间】: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有什么问题? -
如果您担心链表的完整性,您可以将其替换为嵌套集方法或与嵌套集方法结合使用,但会降低插入/删除速度和更复杂的数据管理。