Любая модель работает, когда использование достаточно низкое. Но когда использование является существенным, DDL , например, "ALTER TABLE", для добавления новых аргументов становится, если не чрезмерно, то болезненно дорогим. Нужно сделать так, чтобы схемы таблиц менялись как можно меньше. Таким образом, я бы предпочел ваш первый вариант, если бы мне пришлось выбирать между ними.
Достаточно ли это, на мой взгляд, зависит от того, действительно ли вы хотите запрашивать аргументы и потенциально моделировать высокодинамичные данные, или вам просто нужно место, где можно вставить какой-то текст, и не особенно волнует, что в нем.
Если, например, вы захотите ответить на такие вопросы, как «для каких исполнений определенного задания fuelCount
было установлено на 3?». Для такого рода вопросов вам нужно будет найти существование fuelCount и его значение по существу в неструктурированной текстовой строке. Для сохранения анализа на сервере потребуется неумелая гимнастика, но перетаскивание каждой строки обратно клиенту mysql для анализа аргументов аналогично несостоятельно для всех, кроме самых маленьких наборов данных.
Другой вариант - использовать mysql json , если ваша версия базы данных поддерживает это. Это позволяет вам моделировать аргументы так, как вы хотите, без необходимости изменять формат таблицы при появлении новых значений. Однако вы должны быть достаточно умны, чтобы старые запросы не нарушались при смене моделей. Поддержка json для mysql означает возможность запрашивать данные в json без необходимости извлекать, анализировать и объединять все отдельные записи в клиенте базы данных, так что это довольно удобная функция. У Postgres также есть это.
Например, вы можете сохранить произвольные данные о команде, которая будет выполняться в столбце runtime JSON
, и если вы придерживаетесь некоторых простых правил, вы можете иметь необязательный аргумент для любых аргументов, а также (для пример) переменные окружения, которые также могут потребоваться для программы. Со временем могут возникнуть другие параметры времени выполнения, которые заставят вас добавить больше аргументов к определенным заданиям. тип JSON довольно хорош для этого. Если вы хотите запросить JSON, вы можете. Это позволяет наложить некоторую структуру на данные (например, все аргументы будут находиться в ключе args
словаря верхнего уровня), при этом не нужно предварительно определять каждый аргумент, который может быть передан.
Это хорошо иллюстрируется в приведенной выше ссылке, если идея кажется вам хорошей. Вы, похоже, думаете о чем-то вроде json, так что это может быть простым переходом. Это дает дополнительное преимущество, заключающееся в том, что он очень дружественен к Интернету, так как, если вы создаете REST API, вы, вероятно, уже планируете обмениваться JSON.
Если вы столкнулись с более старой версией mysql и не можете от нее отказаться, или по каким-либо причинам обременены вашими запросами, я все равно рекомендую вам придерживаться первого подхода. Если вы хотите пойти дальше, вы можете добавить таблицу
CREATE TABLE args ( instruction_id int, argkey varchar, argval varchar)
и используйте, например, GROUP_CONCAT , чтобы объединить их вместе, если максимальная длина group_concat
не является ограничивающим фактором. В противном случае вы все равно можете объединить их во время выполнения. Мне это кажется неуклюжим, но он хранит переменные данные в строках и позволяет запрашивать данные на стороне сервера.