#mysql
#mysql
Вопрос:
В настоящее время я создаю веб-страницу с базой данных mysql, где для клиентов будет отображаться наше руководство пользователя.
Проблема, с которой я сталкиваюсь, связана с управлением версиями, в основном с запросами. Я буду хранить «разделы» руководства в виде строк в базе данных с номером версии в качестве столбца для каждого раздела. Поэтому, когда выходит новая версия нашего программного обеспечения, вместо того, чтобы переделывать все руководство, мы можем просто изменить разделы, добавив новую строку (раздел) в базе данных с новым номером версии и добавив тот же «section_id», что и тот, который мы меняем, чтобы он знал, какой это разделзамена. Выполнение этого способа позволит пользователям также искать предыдущие версии руководства пользователя.
Я прочитал в другом сообщении stack overflow, что лучше хранить версии в 3 столбцах в базе данных (основная, второстепенная, сборка / исправление). Если это правильный путь, как мне запросить базу данных, чтобы показать только последние строки «версии» или самые последние предыдущие, если в некоторых разделах нет текущих версий. В принципе, мне все еще нужно показать разделы, которые не были изменены в последней версии.
Если есть более простой способ организовать и запросить базу данных, я также хотел бы знать.
Вот наглядный пример базы данных (столбец position технически находится в другой таблице с индексом section_id, но это только для примера:
Добавлено изображение этой таблицы выше, на случай, если она отображается неправильно.
id | section_name | section_id | position | v_major | v_minor | v_build
------------------------------------------------------------------------
1 section 1 1 2 2 0035
2 section 4 4 2 1 0027
3 section 3 2 2 1 0027
4 section 2 3 2 2 0035
5 section 3 2 2 2 0035
6 section 1 1 2 1 0027
Запрос должен пропустить id # 3 и # 6, поскольку есть новая версия для замены этого section_id.
Имейте в виду, что мне также понадобится способ запрашивать более старую версию аналогичным образом.
Ответ №1:
Не существует универсального правила хранения версий — как обычно, «это зависит» от ваших конкретных потребностей. Нет ничего плохого в одном столбце с именем «версия», если это подходит для вашей среды.
Но независимо от того, сколько полей вы используете для управления версиями, обычно возникает желание узнать «текущую» версию. Вот три примера распространенных способов сделать это:
- Сортировка по «номеру версии» (один столбец или все столбцы объединены вместе), где наибольшее «число» считается текущим (например, «006.000.0001» выше, чем «005.999.1234»)
- Имейте временную метку, связанную с каждой версией (т. Е. Это «Дата вступления в силу»), а Затем сортируйте по этой временной метке, считая самую последнюю дату текущей.
- Но что, если у вас есть совершенно новая версия, которая еще не является «текущей»? Вы также можете использовать выделенный столбец флага с именем что-то вроде IS_CURRENT и явно установить значение этого флага в «TRUE» или любое другое значение, которое вы хотите указать, какая версия является текущей. Конечно, вы должны убедиться, что одна и только одна версия помечается как текущая одновременно, но это не должно быть слишком сложно.
Использование любого из этих методов позволяет вам 1) определить текущую версию и 2) по-прежнему иметь в наличии все предыдущие версии, если / когда они необходимы.
Комментарии:
1. Вау. Большое спасибо за быстрый ответ! Временная метка — отличная идея, о которой я бы никогда не подумал. Я думал о том, чтобы иметь таблицу «версии» и использовать столбец метки времени для объединения обеих таблиц. Имеет ли это смысл?
2. Если у вас есть одна «вещь» (руководство пользователя и т. Д.) С Несколькими версиями, И по крайней мере некоторые атрибуты должны оставаться согласованными между версиями (например, имя, описание, POC, что угодно), тогда вам, вероятно, понадобится только один экземпляр самой вещи и несколько версийотслеживается в отдельной таблице (1 ко многим). Но если атрибуты могут меняться с каждой версией, и вы хотите сохранить исторические значения, тогда вы можете сохранить все это в одной таблице.
3. Большое спасибо за вашу помощь SlimsGhost! Ценю это.
Ответ №2:
Единственная причина иметь несколько столбцов версий — это если порядок сортировки будет неточным для одной строки. Однако это часто бывает, поскольку 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). Если вам нужно больше столбцов, вы можете использовать это как подзапрос. Я бы использовал что-то вроде этого, чтобы пересчитать, какие строки являются текущими, если вам нужно кэшировать их для ускорения (уменьшает человеческую ошибку). Если у вас есть целевая версия, вы даже можете защитить ее в предложении 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)
Комментарии:
1. Вы правы, основная проблема с одним столбцом версии заключается в том, что он не сортируется. Ваш ответ — это то, что я искал, но SlimsGhost сделал хорошее замечание выше о возможном связывании метки времени с каждым номером версии для целей сортировки. Если это не работает должным образом, то вы идеальное решение. Спасибо, что нашли время разобраться в этом. Большое спасибо!
2. Приветствую вас… Я так часто использую этот шаблон, что сохранил его в виде фрагмента.