Database design 在这种情况下,如何处理项目、文章和位置之间的关系?

Database design 在这种情况下,如何处理项目、文章和位置之间的关系?,database-design,relational-database,Database Design,Relational Database,我有一个表格,里面有我可以在很多地方找到的物品和文章的信息。例如,我可以在仓库或商店里购买商品。所以我有一张表,上面有商店信息,还有一张表,上面有仓库信息 如何将itms与可以访问的位置联系起来是最好的方法 我认为一个选项是在表项中有两个外键,一个用于商店,另一个用于仓库。如果我在车间有FK,则仓库的FK必须为空。如果将来项目可以位于其他位置,我可以在项目表中添加新字段 但是当我想显示信息时,我必须检查哪个FK不为空,并显示具体位置的信息。但是如果我使用一个视图来显示项目的信息和位置的主要信息,

我有一个表格,里面有我可以在很多地方找到的物品和文章的信息。例如,我可以在仓库或商店里购买商品。所以我有一张表,上面有商店信息,还有一张表,上面有仓库信息

如何将itms与可以访问的位置联系起来是最好的方法

我认为一个选项是在表项中有两个外键,一个用于商店,另一个用于仓库。如果我在车间有FK,则仓库的FK必须为空。如果将来项目可以位于其他位置,我可以在项目表中添加新字段

但是当我想显示信息时,我必须检查哪个FK不为空,并显示具体位置的信息。但是如果我使用一个视图来显示项目的信息和位置的主要信息,我有许多字段为空,因为不是项目所在的位置

但这是最好的办法吗?还有其他选择,或者这是最正确的方法

谢谢

我认为一个选项是在表项中有两个外键,一个用于商店,另一个用于仓库

当您只能链接到几种位置时,这是一个很好的解决方案。但是如果有(或者将来可能)很多的地点,考虑这样做:

符号表示继承(又名类别、子类型、子类化、泛化层次等)。请在中搜索“子类型关系”以获取更多信息,并查看物理数据库中可能的实现策略的一些详细信息

另见和

但是如果我使用一个视图来显示项目的信息和位置的主要信息,我有许多字段为空,因为不是项目所在的位置

没有什么能帮到你。如果两个数据具有不同的结构,您就不能盲目地将它们“强制”到统一的行中。要么保留一些字段作为可选字段(就像您已经做的那样),要么只获取公共字段(如果您可以接受的话),或者只对每种位置使用单独的查询/视图——没有规则规定您必须在单个数据库中获取所有内容1



1实际上,根据您的客户端库,您可能实际上能够在一个数据库往返中打包多个逻辑上独立的查询。

听起来您应该有一个位置表,然后让项目通过外键包含该表的引用

Item
-----------
ItemId (PK)
ItemName
LocationId (FK)

Location
-----------
LocationId (PK)
LocationName