【问题标题】:How to store sequential data in mysql如何在mysql中存储顺序数据
【发布时间】:2014-06-21 05:31:42
【问题描述】:

我收到了一些 Exercise Routine 内容,这些内容将按顺序显示给用户。下面显示了一个最简单形式的示例。

id 名称 持续时间已完成 -------------------------------------- 1 跳跃 10 1 2 运行 15 0 3 骑自行车 12 0 4 俯卧撑 30 1

通常这些表格最少有 100 行/练习,大约有 300 个表格(针对不同标准的不同练习)。我们没有任何前端,直接使用dbForge Studio数据库编辑器更新数据库。

之前的开发人员设计了该表,以便唯一的 id 列也用作序列号。它也构成 url 的一部分。例如。 xxx/exercise/12 专门在数据库中查找 id=12 的实际第 12 行(他假设所有 id 都以 1 递增并且按顺序递增)而不是 id=12 的行。

明显的问题是,当我们想在表格中添加一个练习时,可以说是在 练习 5 之后,然后我们在 5 之后手动添加它,然后必须手动更新以下所有内容的 id练习,使它们按顺序排列。理想情况下,我们应该在表格中添加一行并以某种方式解释 php 代码,知道这个练习应该出现在 练习 5 之后。 p>

类似地,例如,如果我们删除第 17 号的练习,那么来自 url xxx/exercise/17 的内容将不会被提供。理想情况下,id=18 现在按顺序位于第 17 位,因此必须提供该内容。

尝试

我曾考虑添加另一个列序列,它会告诉您以什么顺序提供服务。但话又说回来,我又回到了第 1 格,因为我必须在添加/删除时更新序列号。

我还考虑过创建另一个表并以我们想要提供内容的任何顺序存储 ID 号。 - 但我不确定这是否真的是个好主意。


谁能指导我为这个问题设计合适的数据库/表?

编辑

我想我的问题并不清楚。
我不想重新填充/重新排序密钥。我知道这不是应该设计数据库的方式。
但问题是,如果我在表格末尾添加内容,那么我如何告诉 table/php 我想要提供新添加的内容(id 可以说 127)在 id=15 之后而不是最后上菜。

【问题讨论】:

  • 问题在于您的基本信念是缺少 id 是不好的,删除 16 并且从不重新填充没有任何害处。事实上,这是一件好事。每次你重新排序所有链接都会改变,这对谷歌和用户来说是相当烦人的
  • 是的,您不应该重复使用密钥,即使它们已被删除。但我认为这个问题更多地与自定义排序有关,而不是主键。
  • 我同意。我想我的问题还不清楚。我不想重新填充钥匙。但是如果我在表格的末尾添加一个内容,那么我如何告诉 table/php 我想要提供新添加的内容(id 可以说 127)在 15 之后而不是最后提供....我也更新了我的问题。

标签: php mysql sql database database-design


【解决方案1】:

关于,“我还考虑过创建另一个表并按照我们想要提供内容的任何顺序存储 ID 号。-但我不确定这是否真的是个好主意。”

这不是一个好主意,这是一个绝妙的主意。这是一个骨架设计。它并不完美,但可以帮助您入门。

表练习 - 练习 ID、练习名称、测量值、您可能需要的其他字段。 NameOfExercise 的示例值是俯卧撑,以重复为单位测量,以及 RunningOnTheSpot,以秒为单位测量。

表例程 - RoutineId、NameOfRoutine、您可能需要的其他字段。示例值为 Jane Fonda 的例程、海军海豹队的例程和老屁的例程。

最后,表ExerciseRoutine。这是一个多对可能的关系。一项锻炼可以不只是例行公事,而且一个例行程序可以有多个锻炼。字段可以是、ExerciseID、RoutineID、Sequence、MeasuredInMultipler 以及您可能需要的其他字段。

这是一些示例数据。

ExerciseId, NameOfExercise,       MeasuredIn
1           Push Ups              repetitions
2           Running on the Spot   seconds
3           Jumping Jacks         repetitions

RoutineId, NameOfRoutine
1          Jane Fonda
2          Navy Seal

最后

 RoutineID, ExerciseID, Sequence, MeasuredInMultipler
 1          2           1         60
 1          3           2         10
 2          1           1         500
 2          3           2         100

所以 Jane Fonda 例程在现场运行 60 秒,然后是 10 个 Jumping Jacks。与此同时,海豹突击队的常规是 500 次俯卧撑,然后是 100 次跳跃式千斤顶

这种方法允许您拥有许多相互独立的例程。

【讨论】:

  • 感谢您的示例。我已经理解了这个概念。由于我需要非常简单的版本,我可能会将序列作为字符串存储在单独的表中。所以操作和重新排序会更容易。
【解决方案2】:

如何让当前的 id 保持原样,让它们保持为 id 并在您的 URI 中工作。创建一个新列进行排序。除了将这些值增加 1 之外,您还可以为每个连续的行增加 5、10 或 100。这允许您在现有行之间插入新行,而无需修改以前的数据。

【讨论】:

  • YE 增加 5 或 10 似乎是个好主意。但问题是,如果我在表格末尾添加内容,那么我如何告诉 table/php 我想在 id=15 之后提供新添加的内容(ID 为 127),而不是最后提供。我不想手动更改 id / 排序列。
【解决方案3】:

您可以添加一个排序列,然后在插入或删除时执行附加的更新语句来更正排序列。如果你真的想要你可以查看MySQL triggers 来执行更新

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多