У меня небольшая проблема с некоторыми таблицами, в которых я хочу иметь действительные данные и предотвратить вставку недействительных данных.Моя идея заключалась в том, чтобы использовать FK для этого, но у меня нет нужного столбца внутри таблицы, он мне понадобится.Должен ли я добавить его, хотя он на самом деле не принадлежит или что в этом случае следует сделать?
Таблицы:
box
----------------------------------------
box_id (PK) box_type_id (FK->box_type)
1 1
2 1
----------------------------------------
box_type
---------------------------------
box_type_id (PK) width length
1 40 30
2 50 40
---------------------------------
box_pos
--------------------------------------------------------------------
box_id (PK, FK->box) box_pos_id (PK) item_id (FK->item) amount
1 1 item1 10
1 2 item2 100
1 3 item3 500
2 1 item2 50
--------------------------------------------------------------------
item
------------------------
item_id (PK) otherstuff
item1 yadayada
item2 yadayada
item3 yadayada
------------------------
item_box_type
-------------------------------------------------------------------------
item_id (PK, FK->item) box_type_id (PK, FK->box_type) amount_full_box
item1 1 500
item1 2 600
item2 1 400
-------------------------------------------------------------------------
Итак, у меня есть коробка с определенным типом.Для этого ящика у меня есть положения ящиков (разные предметы с количеством внутри ящика), и у меня есть еще одна таблица, в которой есть некоторая информация, например, сколько этого предмета составляет полный ящик.
Я хочу, чтобы данные не быливставлен в box_pos, у которого нет записи внутри item_box_type, но у меня нет box_type на позициях, потому что он принадлежит блоку.Есть ли лучше, чем добавить box_type в box_pos, что нарушит правила нормализации, поскольку это не зависит от ключа box_id / box_pos_id, а зависит только от box_id.
Конечно, я мог бы использовать триггеры, вставкуТриггер / update для box_pos, чтобы проверить, существует ли комбинация box.box_type_id и box_pos.item_id в таблице item_box_type, и триггер удаления для item_box_type, чтобы проверить, есть ли еще строка внутри box_pos с этой комбинацией, но мне нравится избегатьзапускается, если возможно, потому что их влияние на производительность больше, и они довольно сильно привязаны к используемым rdbms.