SQL多个外键 vs. 单个外键用于多个表

9 浏览
0 Comments

SQL多个外键 vs. 单个外键用于多个表

我正在努力弄清如何在我的数据库中定义外键。

假设我有三个表格:

  • 站点(这是公司所在的地方)
  • 仓库(在这个站点上可以有多个仓库)
  • 仓库位置(在那个仓库中有多个位置,例如货架)

现在,

  • 站点-仓库是一对多的关系
  • 仓库-仓库位置是一对多的关系

什么时候我会用多个外键来描述仓库位置,一个指向仓库.id,一个指向站点.id

站点 --[ 仓库
  |         ---
  |          |
  +----[ 仓库位置

什么时候我只会用:

 站点 --[ 仓库 --[ 仓库位置

在第一种选择中,当我查找一个仓库位置时,我需要站点.id仓库.id

在第二种选择中,当我查找一个仓库位置时,我只需要仓库.id,但是要查找仓库,我需要站点.id

我对哪种选择适用于什么情况感到困惑。有人可以给我一些关于两种选择的优缺点的提示吗?

0
0 Comments

多个外键与多个表上的单个外键之间的区别在于,从功能角度来看,多个外键的设计方式更合理。

仓库位置表(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)

希望这可以帮助你!谢谢!这些信息和提供的链接应该能帮助我更好地理解它!

0