Отрефакторить таблицу связи с дополнительным флагом

Мне надо отрефакторить код, работающий с модификаторами для блюд в ресторане. Модификаторы это, например, соусы всякие к пиццам, которые могут изменять стоимость этих самых пицц.

Имеется таблицы modification (модификаторы) и product (блюда). Связь между ними many-to-many. Предыдущий коллега сделал костыль для связи модификаторов с блюдами в виде дополненной таблицы связи:

create table modification_product
(
    disabled bit,
    modification_id int,
    product_id int
)

Эта таблица позволяет выключить модификатор для отдельного блюда, не удаляя запись из базы и не проставляя флаг глобально в таблицу modification. Но этот же флаг не дает мне применить аннотацию @ManyToMany хибернейта и настроить @JoinTable.

Как можно отрефакторить это место, чтобы здесь была связь many-to-many, но при этом была возможность отключить модификатор точечно для выбранного блюда?


Ответы (1 шт):

Автор решения: Basil Peace

Следует удалить колонку disabled. Колонки вида disabled в таблицах многие-ко-многим — это решение для хранилищ данных, в OLTP-приложениях оно не нужно.

возможность отключить модификатор точечно для выбранного блюда

Возможность есть, называется DELETE. @ManyToMany сделает это для вас.

Таким образом, отключенные модификаторы просто не будут храниться в таблице. Если надо будет для блюда получить список, какие модификаторы включены или выключены — это можно сделать через modification LEFT JOIN modification_product

P.S. Если в modification_product есть ещё другие колонки помимо disabled, тогда уже, как указал @Alex Krass в комментарии, это отдельная сущность

→ Ссылка