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