sql - 添加不属于表的列以使用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 密切相关。
解决方案
我想要的是防止数据被插入
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
.
推荐阅读
- python-3.x - 在 minmaxscalar 期间超出最大递归深度
- python - TypeError: 不支持的操作数类型 -: 'generator' 和 'NoneType'
- docker - /bin/sh 返回非零代码:docker alpine 中的 1
- php - Ninja Forms 动作的顺序可以更改吗?
- ios - 有没有办法知道广告设备是安卓还是ios?
- excel - 如何循环 VBA 代码以运行每个列值(20,000 多个单元格)而不使其变慢
- mongodb - 点和美元符号的mongodb含义
- c# - 我正在寻找“滑动阵列”
- google-cloud-platform - 如何从 Catalog API 获取 GCP 定价列表
- html - 使输入字段在长类型上增长