我目前正在创建一个带有mysql数据库的网页,我们会为客户显示我们的用户手册。
我遇到的问题是版本控制,主要是查询。我将把手册的“部分”存储为数据库中的行,版本号作为每个部分的列。因此,当我们的软件的新版本出来时,我们可以通过在数据库中使用新的版本号添加新的行(部分)来更改部分,而不是重做整个手册,并添加与我们相同的“section_id”。正在改变所以它将知道它正在替换哪个部分。这样做将允许用户也搜索用户手册的先前版本。
我在另一个堆栈溢出帖子上读到,最好将版本存储在数据库的3列中(主要版本,次要版本,构建版本/补丁版本)。如果这是要采用的方法,如果某些部分没有当前版本,我将如何查询数据库以仅显示最新的“版本”行或最近的前一行。基本上,我仍然需要显示最新版本中未更改的部分。
如果有更简单的方法来组织和查询数据库,我也想知道。
这是数据库的可视化示例(位置列在技术上位于带有section_id索引的不同表中,但这仅用于示例:
添加了上表中的图像,以防它无法正确显示。
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。
请记住,我需要一种以类似方式查询旧版本的方法。
我知道这听起来很复杂,但我真的希望有人可以帮我解决这个复杂的问题。
提前致谢。
答案 0 :(得分:0)
如何存储版本没有通用的规则 - 像往常一样,"它取决于您的特定需求。名为" version"的单个列如果适用于您的环境,则没有任何问题。
但无论您使用多少字段进行版本控制,通常都希望了解"当前"版。以下是三种常见方法的例子:
使用这些方法中的任何一种方法都可以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)