Вложенные таблицы в базе данных [дубликаты]

Я работаю над проектом, в котором есть несколько процессов, и каждый процесс имеет разные элементы данных для обработки. Элементы данных (для разных процессов) имеют разные столбцы (но всегда одни и те же столбцы для одного и того же процесса).

Сначала я предположил, что было бы неплохо иметь таблицу для всех процессов, а затем, всякий раз, когда создается новый процесс, можно было бы создать и другую таблицу с данными элемента, но оказалось, что будет новый способ процесса часто создавать новые таблицы все время. Затем я изучал вложенные таблицы, но обнаружил, что в MySQL нет концепции вложенных таблиц. (Я слышал, что это можно сделать с помощью MariaDB. Кто-нибудь работал с ним?)

Чтобы было немного понятнее, вот текущая концепция (столбцы и значения здесь только приблизительны, чтобы сделать концепцию более понятной):

таблица_процессов:

ID | process_name | item_id | ...
---------------------------------
1  | some_process | 111     | ...    
2  | other_process| 222     | ...    
3  | third_process| 333     | ...    
4  | third_process| 444     | ...
...

item_tables:

item_table_1:
ID | Column1 | Column2 | process_name | ...
--------------------------------------
111| val1    | val2    | some_process | ...
...

item_table_2:
ID | Column4 | Column5 | process_name | ...
--------------------------------------
333| val1    | val2    | third_process| ...
444| val3    | val4    | third_process| ...
...

Таким образом, для каждого нового процесса будет новая таблица item_table, и для каждого процесса должны быть разные имена столбцов, а в таблице элементов конкретный элемент будет связан со столбцом «item_id» в таблице процессов.

Я думаю, что самым простым решением (при создании новых таблиц все время не вариант) для этого будут вложенные таблицы, где в таблице процессов может быть еще один столбец, в котором будут храниться значения item_table, а затем те, которые могли бы иметь различные столбцы в зависимости от самого процесса.

Итак, большой вопрос: есть ли хоть что-то похожее на вложенные таблицы или что-то еще в MySQL, что помогло бы мне реализовать подобную структуру, не создавая все время новые таблицы, и если нет, то, возможно, есть есть советы или отзывы о MariaDB? Может быть, кто-то уже реализовал с ним вложенные таблицы (если это вообще возможно)

Одним из решений может быть наличие одной таблицы для 'item_table', а затем одного столбца для всех различных значений процессов, которые будут храниться, например, в формате JSON, но это сделает намного сложнее читать таблицу.

Например:

item_table:
ID | process_name | data
--------------------------------------
111| some_process | {values: {column1:val1,column2:val2,...}}

person Oskars    schedule 21.01.2020    source источник
comment
Рассматривали ли вы либо нормализацию данных, либо наличие одного столбца в таблице элементов для каждого возможного столбца? т.е. просто введите Col1|col2|col3|col4 и заполните только те, которые вам нужны?   -  person JeffUK    schedule 21.01.2020
comment
Это неправильная нормализация данных, которая принесет вам много проблем в будущем. Если вам нужны разные имена столбцов, то лучше напишите объект JSON для каждого идентификатора, как в вашем примере. MySQL теперь имеет встроенную поддержку JSON, поэтому чтение будет довольно простым.   -  person mitkosoft    schedule 21.01.2020
comment
@mitkosoft отлично, спасибо, не знал, что MySQL теперь поддерживает JSON. Я проверю это.   -  person Oskars    schedule 21.01.2020


Ответы (1)


Используете ли вы значения из таблицы элементов для обработки или что-то в этом роде (вы выполняете запросы к ним)?

Эта структура таблицы/базы данных выглядит... неэффективной и непригодной для сопровождения.

Все это должно быть сделано с помощью всего двух таблиц. Таблица процессов и таблица элементов, содержащая process_id (не имя) из таблицы процессов.

Если количество столбцов для элементов всегда одинаково, просто используйте «общие» имена для значений, таких как value_1, value_2 (или что-то еще, что лучше всего подходит для процесса) или поле json/blob/varchar со строкой JSON, например. (зависит от того, нужно ли вам выполнять запросы к этим данным)

id | process_id | data

EDIT: ваше редактирование и второе решение должны быть правильными. «легкочитаемость» не имеет приоритета над функциональностью и производительностью.

person Bert Maurau    schedule 21.01.2020
comment
Поле json/blob/varchar столь же неэффективно и неуправляемо; было бы лучше хранить любые столбцы как столбцы. - person JeffUK; 21.01.2020
comment
Спасибо, я проверю поддержку MySQL для JSON. Вся проблема возникает из-за того, что невозможно нормализовать имена столбцов (можно нормализовать количество столбцов, но только если для некоторых процессов нормально использовать только несколько столбцов и оставлять остальные пустыми) - person Oskars; 21.01.2020
comment
@JeffUK Верно, но зависит от того, используете ли вы значения для каких-либо запросов или операций с базой данных или просто храните только информацию о процессе, тогда это обеспечит большую гибкость на случай, если сумма столбца процесса изменится в будущем, или вы хотите хранить дополнительную информацию в будущем, я думаю? - person Bert Maurau; 21.01.2020
comment
Я заметил добавленные ссылки на «уже отвеченный вопрос», и это действительно было бы более эффективным способом. - person Bert Maurau; 21.01.2020