web-dev-qa-db-ja.com

リレーショナルデザイン-複数のテーブルを1つの外部キー列に?

肉の購入を追跡する表を見てください。購入した肉の種類を示す「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にとらわれない回答のみをお願いします。

6
tgxiii

私はあなたがサブタイプ/スーパータイプの構造を探していると思います。肉は移行キーであり、関連する肉のサブタイプを示すTypeフィールドを含みます。そう:

PurchaseMeat = Meat = {MeatBeef、MeatPork、MeatPoultry}

Meatはサブタイプのタイプとキーです。

クロウの足の表記では、これはその下に線のある円です。

4
dba4life

肉の種類ごとに他のテーブルを作成することはありません。肉の種類とカットの種類を作成し、FKを使用してそれらをすべて結び付けます。以下のサンプル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
3
SqlSandwiches

コースの馬

完全に異なる運用ソリューションでeコマースソリューションに参加しようとしています。あなたがしなければならないことは、eコマースを別の境界のあるコンテキスト、つまり部署であると考えることです。したがって、それは別のデータベースを持っています。

部署:販売

部門:肉の生産

この場合、sales.orderにはsales.productsを持つsales.order_linesがあり、productには肉製品を説明する説明フィールドがあります。

PRODUCTIONの肉の詳細が必要な場合は、product.specificationsとして販売DBに送信されます。

0
jim smith