关系设计 - 多个表格成一个外键列?
-
16-10-2019 - |
题
拿一张可以追踪肉类购买的桌子。它具有“肉_id”外键柱,以指示购买的肉类是什么类型。
但是,不同类型的肉在某种程度上是独一无二的(例如USDA分级),因此我认为它们应该存储在不同的桌子中。
目前,我没有足够的代表来发布我抽出的ERD,但我希望这些DDL会足够(我简短地简化了它们):
CREATE TABLE meat_purchase
(
id INTEGER
, purchase_details VARCHAR(4000) -- actually multiple columns, but details are irrelevant
, meat_id INTEGER
);
CREATE TABLE beef_meats
(
id INTEGER
, usda_beef_grade_id INTEGER
FOREIGN KEY REFERENCES usda_beef_grades
, desc VARCHAR(4000)
);
CREATE TABLE pork_meats
(
id INTEGER
, desc VARCHAR(4000)
);
CREATE TABLE poultry_meats
(
id INTEGER
, bird_id
FOREIGN KEY REFERENCES birds
, desc VARCHAR(4000)
);
-- and so on for the different types of meat...
我想知道如何将“肉食”桌子与肉桌相关联。
请仅标准SQL和RDBMS不可知论答案。
解决方案
我认为您正在寻找亚型/超级型结构。肉将是您的迁移钥匙,并包含一个类型的字段,该字段指示其与哪种肉类相关的肉类。所以:
puphasemeat =肉= {肉贝,肉馅饼,肉池}
肉是亚型的类型和钥匙。
在乌鸦的脚符号中,这是一个圆圈,下面有一条线。
其他提示
我不会为不同种类的肉创建其他桌子。我会创建肉类类型和切割类型,然后使用FKS将它们全部绑在一起。下面的样本DB:
USE MEAT
CREATE TABLE [dbo].[MeatCut](
[MeatCutID] [int] NOT NULL,
[Description] [varchar](500) NOT NULL,
CONSTRAINT [PK_MeatCut] PRIMARY KEY CLUSTERED
( [MeatCutID] ASC))
GO
CREATE TABLE [dbo].[MeatType](
[MeatTypeid] [int] NOT NULL,
[Description] [varchar](500) NOT NULL,
[usda_beef_grade_id] [int] NOT NULL,
CONSTRAINT [PK_MeatType] PRIMARY KEY CLUSTERED
( [MeatTypeid] ASC))
CREATE TABLE [dbo].[MeatProduct](
[MeatProductID] [int] NOT NULL,
[MeatTypeID] [int] NULL,
[MeatCutID] [int] NULL,
CONSTRAINT [PK_MeatProduct] PRIMARY KEY CLUSTERED
( [MeatProductID] ASC))
GO
CREATE TABLE [dbo].[meat_purchase](
[PurchaseID] [int] NOT NULL,
[purchase_details] [varchar](4000) NULL,
[MeatProduct_id] [int] NULL,
CONSTRAINT [PK_meat_purchase] PRIMARY KEY CLUSTERED
( [PurchaseID] ASC))
GO
ALTER TABLE [dbo].[MeatProduct] WITH CHECK ADD CONSTRAINT [FK_MeatProduct_MeatCut] FOREIGN KEY([MeatCutID]) REFERENCES [dbo].MeatCut] ([MeatCutID])
GO
ALTER TABLE [dbo].[MeatProduct] CHECK CONSTRAINT [FK_MeatProduct_MeatCut]
GO
ALTER TABLE [dbo].[MeatProduct] WITH CHECK ADD CONSTRAINT [FK_MeatProduct_MeatType] FOREIGN KEY([MeatTypeID])
REFERENCES [dbo].[MeatType] ([MeatTypeid])
GO
ALTER TABLE [dbo].[MeatProduct] CHECK CONSTRAINT [FK_MeatProduct_MeatType]
GO
ALTER TABLE [dbo].[meat_purchase] WITH CHECK ADD CONSTRAINT [FK_meat_purchase_MeatProduct] FOREIGN KEY([MeatProduct_id])
REFERENCES [dbo].[MeatProduct] ([MeatProductID])
GO
ALTER TABLE [dbo].[meat_purchase] CHECK CONSTRAINT [FK_meat_purchase_MeatProduct]
GO
马的马
您正在尝试使用完全不同的操作解决方案加入电子商务解决方案。您需要做的是将电子商务视为一个单独的有限上下文,也就是一个部门,因此它具有单独的数据库。
部门:销售
部门:肉类生产
在这种情况下
如果您需要生产中的肉类细节,则将它们作为产品发送到您的销售数据库。
不隶属于 dba.stackexchange