SQL多个外键 vs. 单个外键用于多个表
SQL多个外键 vs. 单个外键用于多个表
我正在努力弄清如何在我的数据库中定义外键。
假设我有三个表格:
- 站点(这是公司所在的地方)
- 仓库(在这个站点上可以有多个仓库)
- 仓库位置(在那个仓库中有多个位置,例如货架)
现在,
站点-仓库
是一对多的关系仓库-仓库位置
是一对多的关系
什么时候我会用多个外键来描述仓库位置
,一个指向仓库.id
,一个指向站点.id
?
站点 --[ 仓库 | --- | | +----[ 仓库位置
什么时候我只会用:
站点 --[ 仓库 --[ 仓库位置
在第一种选择中,当我查找一个仓库位置
时,我需要站点.id
和仓库.id
。
在第二种选择中,当我查找一个仓库位置
时,我只需要仓库.id
,但是要查找仓库,我需要站点.id
。
我对哪种选择适用于什么情况感到困惑。有人可以给我一些关于两种选择的优缺点的提示吗?
多个外键与多个表上的单个外键之间的区别在于,从功能角度来看,多个外键的设计方式更合理。
仓库位置表(WareHouseLocation)只有仓库ID(WareHouseID)作为外键,仓库表(WareHouse)只有站点ID(SiteID)作为外键。
从功能角度来看,仓库位置表指定了仓库的位置,因此外键的设计方式是合适的。但是,如果你仔细思考一下,仓库位置表与站点没有任何关系。因此,从功能角度来看,这种关系并没有太多的意义。
然而,从查询的角度来看,这种设计方式非常好,因为在大多数情况下,当查询仓库位置表时,都需要检索站点ID和仓库ID。将它们直接存储在同一张表中可以减少连接操作,并且使查询变得更加简单。这似乎是你在数据库设计方面所面临的困境的关键所在。
数据库设计是一个非常复杂的主题,需要考虑很多因素,其中一些因素非常具体,与项目本身有关。一个通用的经验法则是尽可能保持数据库的规范化(尤其是在阅读教科书时)。然而,在实践中,很多数据库设计师更倾向于至少部分非规范化数据库。规范化/非规范化数据库是一个非常有争议的话题,所以我不会在这里详细讨论。你可以在以下帖子中了解更多信息:
- [How far to take normalization in database design?](https://stackoverflow.com/questions/496508)
- [How does one know when to stop normalizing?](https://dba.stackexchange.com/questions/81548/how-does-one-know-when-to-stop-normalizing)
希望这可以帮助你!谢谢!这些信息和提供的链接应该能帮助我更好地理解它!