添加不属于该表的列以使用FK吗?

时间:2018-10-18 06:57:35

标签: sql foreign-keys

我对某些表有一些问题,在这些表中我想拥有有效数据并防止插入无效数据。我的想法是为此使用FK,但我在表内没有需要的列。我应该添加它,尽管它并不是真正属于它的,或者在这种情况下应该怎么做?

表格:

----------------------------------------
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_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,这会违反规范化规则。

我当然可以使用触发器,在box_pos上使用插入/更新触发器来检查表item_box_type中是否存在box.box_type_id和box_pos.item_id的组合,并在item_box_type上使用delete触发器来检查是否仍然存在在box_pos内使用该组合的行,但是我希望尽可能避免使用触发器,因为它们对性能的影响更大,并且它们与使用中的rdbms紧密相关。

1 个答案:

答案 0 :(得分:1)

  

我想要的是防止将数据插入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