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

Sql 添加不属于表的列以使用FK?,sql,foreign-keys,Sql,Foreign Keys,我有一个小问题,一些表,我想有有效的数据,并防止插入无效的数据。我的想法是使用FK来实现这一点,但我在表中没有需要的列,我需要它。我是否应该添加它,尽管它不是真正属于那里,或者在这种情况下应该怎么做 表: 框 ---------------------------------------- box_id (PK) box_type_id (FK->box_type) 1 1 2

我有一个小问题,一些表,我想有有效的数据,并防止插入无效的数据。我的想法是使用FK来实现这一点,但我在表中没有需要的列,我需要它。我是否应该添加它,尽管它不是真正属于那里,或者在这种情况下应该怎么做

表:

----------------------------------------
box_id (PK)   box_type_id (FK->box_type)
          1                            1
          2                            1
----------------------------------------
盒型

---------------------------------
box_type_id (PK)   width   length
               1      40       30
               2      50       40
---------------------------------
-------------------------------------------------------------------------
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_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
------------------------
项目箱类型

---------------------------------
box_type_id (PK)   width   length
               1      40       30
               2      50       40
---------------------------------
-------------------------------------------------------------------------
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中,该box_pos在item_box_type中没有条目,但我在positions上没有box_type,因为它属于box。是否有比将box\u类型添加到box\u pos更好的方法,这将违反规范化规则,因为它不依赖于box\u id/box\u pos\u id键,而只依赖于box\u id

当然我可以用触发器,box\u-pos上的insert/update触发器用于检查表item\u-box\u-type中是否存在box.box\u-type和box\u-pos.item\u-id的组合,item\u-box\u-type上的delete触发器用于检查box\u-pos中是否仍有一行具有该组合,但我希望尽可能避免使用触发器,因为它们对性能的影响更大,而且与正在使用的rdbms有很大的关联

我想要的是防止数据插入到
框中
在
项目框\u type
中没有条目

如果您不喜欢您的
box\u pos
中的
box\u type\u id
,您可以重新构造您的
项目\u box\u type
,如下所示:

--------------------------
item_box_id           (PK)
item_id        (FK) UNIQUE
box_type_id    (FK) UNIQUE
amount_full_box
并通过引用
项目箱类型
表,将
项目箱id
替换为
项目箱id
,从而重新构造您的
项目箱位置
,从而实现所需的约束



然而,最简单的解决方案是
box\u pos.box\u type\u id

第一种解决方案意味着我有一个冗余数据的加载,因为对于该box\u type\u id/item\u id组合的每个项目\u box\u id,数量和其他信息总是相同的。对于无效数据来说,这将是一个更大的风险,表需要相当多的插入/更新/删除,而它几乎是静态数据。盒子里的盒子类型id感觉不太对劲,但如果这是最好的解决方案,那就是最好的解决方案,只是认为这是错误的,我错过了一些更好的解决方案。@aLpenbog似乎我对你所说的冗余问题不是很了解。。由于
唯一性
约束,重组后的
项目箱类型
将不会出现冗余的
项目箱类型id/项目箱id
组合的问题。对不起,我的问题。看起来是个有趣的解决方案。但我认为最好是将box\u type\u id放在box\u pos中,而不是使用代理键,我不想将项目id移开。