Отрефакторить таблицу связи с дополнительным флагом
Мне надо отрефакторить код, работающий с модификаторами для блюд в ресторане. Модификаторы это, например, соусы всякие к пиццам, которые могут изменять стоимость этих самых пицц.
Имеется таблицы modification (модификаторы) и product (блюда). Связь между ними many-to-many. Предыдущий коллега сделал костыль для связи модификаторов с блюдами в виде дополненной таблицы связи:
create table modification_product
(
disabled bit,
modification_id int,
product_id int
)
Эта таблица позволяет выключить модификатор для отдельного блюда, не удаляя запись из базы и не проставляя флаг глобально в таблицу modification. Но этот же флаг не дает мне применить аннотацию @ManyToMany хибернейта и настроить @JoinTable.
Как можно отрефакторить это место, чтобы здесь была связь many-to-many, но при этом была возможность отключить модификатор точечно для выбранного блюда?
Ответы (1 шт):
Следует удалить колонку disabled
.
Колонки вида disabled
в таблицах многие-ко-многим — это решение для хранилищ данных, в OLTP-приложениях оно не нужно.
возможность отключить модификатор точечно для выбранного блюда
Возможность есть, называется DELETE
.
@ManyToMany
сделает это для вас.
Таким образом, отключенные модификаторы просто не будут храниться в таблице. Если надо будет для блюда получить список, какие модификаторы включены или выключены — это можно сделать через modification LEFT JOIN modification_product
P.S. Если в modification_product
есть ещё другие колонки помимо disabled
, тогда уже, как указал @Alex Krass в комментарии, это отдельная сущность