我对某些表有一些问题,在这些表中我想拥有有效数据并防止插入无效数据。我的想法是为此使用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紧密相关。
答案 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
。