Добавить столбец, не принадлежащий таблице, чтобы использовать FK? - PullRequest
0 голосов
/ 18 октября 2018

У меня небольшая проблема с некоторыми таблицами, в которых я хочу иметь действительные данные и предотвратить вставку недействительных данных.Моя идея заключалась в том, чтобы использовать 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.

1 Ответ

0 голосов
/ 18 октября 2018

Я хочу предотвратить вставку данных в box_pos, который не имеет записи внутри item_box_type ...

Если вам не нравится box_type_id в вашем box_pos вы можете реструктурировать свой item_box_type следующим образом:

--------------------------
item_box_id           (PK)
item_id        (FK) UNIQUE
box_type_id    (FK) UNIQUE
amount_full_box

И реструктурировать свой box_pos, заменив item_id на item_box_id, ссылаясь на таблицу item_box_type, тем самымдостижение необходимого ограничения.


Самое простое решение - это box_pos.box_type_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...