リレーショナルデザイン-1つの外部キー列に複数のテーブル?
-
16-10-2019 - |
質問
肉の購入を追跡するテーブルを取ります。 「Meat_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...
「Meat_Purchases」テーブルを肉のテーブルに関連付ける方法を疑問に思っています。
標準的なSQLおよびRDBMS不可知論の答えのみをお願いします。
解決
サブタイプ/スーパータイプのコンストラクトを探していると思います。肉はあなたの移動鍵であり、それが関連する肉のサブタイプを示すタイプのフィールドを含むでしょう。それで:
purchasemeat = meat = {meatbeef、meatpork、meat poultry}
ここで、肉はサブタイプのタイプであり、キーです。
カラスの足の表記では、これはその下に線がある円です。
他のヒント
私はさまざまな種類の肉のために他のテーブルを作成しません。肉の種類を作成し、タイプをカットし、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
コースのための馬
まったく異なる運用ソリューションを使用して、eコマースソリューションに参加しようとしています。あなたがする必要があるのは、eコマースを別の境界付きコンテキスト、つまり部門として考えることです。したがって、個別のデータベースがあります。
部門:販売
部門:肉生産
この場合、sales.orderにはsales.order_linesがあります。
生産から肉の詳細が必要な場合、それらはあなたの販売dbにdbに送られます。