在MySQL数据库中使用不同版本组织手册

时间:2016-10-07 16:10:00

标签: mysql database mysqli mysqli-multi-query

我目前正在创建一个带有mysql数据库的网页,我们会为客户显示我们的用户手册。

我遇到的问题是版本控制,主要是查询。我将把手册的“部分”存储为数据库中的行,版本号作为每个部分的列。因此,当我们的软件的新版本出来时,我们可以通过在数据库中使用新的版本号添加新的行(部分)来更改部分,而不是重做整个手册,并添加与我们相同的“section_id”。正在改变所以它将知道它正在替换哪个部分。这样做将允许用户也搜索用户手册的先前版本。

我在另一个堆栈溢出帖子上读到,最好将版本存储在数据库的3列中(主要版本,次要版本,构建版本/补丁版本)。如果这是要采用的方法,如果某些部分没有当前版本,我将如何查询数据库以仅显示最新的“版本”行或最近的前一行。基本上,我仍然需要显示最新版本中未更改的部分。

如果有更简单的方法来组织和查询数据库,我也想知道。

这是数据库的可视化示例(位置列在技术上位于带有section_id索引的不同表中,但这仅用于示例:

mysql table

添加了上表中的图像,以防它无法正确显示。

id | section_name | section_id |位置| v_major | v_minor | v_build

1 section 1 1 2 2 0035 2第4节4 2 1 0027 3第3节2 2 1 0027 4第2节3 2 2 0035 5第3节2 2 2 0035 6第1 1 2 1 0027

查询应跳过ID#3和#6,因为有一个新版本要替换section_id。

请记住,我需要一种以类似方式查询旧版本的方法。

我知道这听起来很复杂,但我真的希望有人可以帮我解决这个复杂的问题。

提前致谢。

2 个答案:

答案 0 :(得分:0)

如何存储版本没有通用的规则 - 像往常一样,"它取决于您的特定需求。名为" version"的单个列如果适用于您的环境,则没有任何问题。

但无论您使用多少字段进行版本控制,通常都希望了解"当前"版。以下是三种常见方法的例子:

  1. 按"版本号"排序(一列或所有列连接在一起),其中最高的"数字"被视为当前(例如" 006.000.0001"高于" 005.999.1234",例如)
  2. 有一个与每个版本相关联的时间戳(即它"生效日期"),然后对此时间戳进行排序,将最近的日期视为当前日期。
  3. 但是如果你有一个尚未推出的全新版本"当前&#34 ;?您还可以使用名为IS_CURRENT的专用标志列,并将此标志的值显式设置为" TRUE"或者你想要指出哪个版本是最新的值。当然,你必须确保一次只有一个版本标记为当前版本,但这不应该太难。
  4. 使用这些方法中的任何一种方法都可以1)识别当前版本,2)如果需要,可以使用所有以前的版本。

答案 1 :(得分:0)

拥有多个版本列的唯一原因是,排序顺序是否与单个字符串不准确。然而,情况往往如此,2.10.1实际上比2.2.50更新,但不是词法上的。我想这就是你追求的目标:

SELECT 
  CAST(SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT id ORDER BY v_major DESC, v_minor DESC, v_build DESC), ',', 1) AS UNSIGNED) 
FROM tbl
GROUP BY section_name, section_id

它获取每个(section_name,section_id)对的最新ID。如果需要更多列,可以将其用作子查询。如果你需要缓存它以提高速度(减少人为错误),我会使用类似这样的东西重新计算哪些行是最新的。如果您有一个目标版本,您甚至可以在WHERE子句中保护它:

WHERE v_major <= 2 AND IF(v_major = 2, v_minor <= 1, 1) AND IF(v_major = 2 AND v_minor = 1, v_build <= 27, 1)