首页 > 解决方案 > 添加不属于表的列以使用FK?

问题描述

我对一些想要有效数据并防止插入无效数据的表有一点问题。我的想法是为此使用 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 上的删除触发器来检查表内是否还有一行box_pos 与该组合,但我喜欢尽可能避免使用触发器,因为它们对性能的影响更大,而且它们与使用中的 rdbms 密切相关。

标签: sqlforeign-keys

解决方案


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


不过,最简单的解决方案是box_pos.box_type_id.


推荐阅读