Реляционный дизайн - несколько таблиц в один столбец иностранного ключа?

dba.stackexchange https://dba.stackexchange.com/questions/2754

  •  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 только агностические ответы, пожалуйста.

Это было полезно?

Решение

Я думаю, что вы ищете конструкцию подтипа/супертипа. Мясо было бы вашим мигрирующим ключом и будет содержать поля типа, которое указывает, к какому подтипу мяса он относится. Так:

Покупайте = мясо = {Meatbeef, Meatpork, Meatpoultry}

Где мясо является типом и ключом подтипа.

В ногах вороны это круг с линией под ним.

Другие советы

Я бы не стал создавать другие столы для разных видов мяса. Я бы создавал типы мяса и вырезал типы, а затем использовал 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

Лошади для курсов

Вы пытаетесь присоединиться к решению электронной коммерции с совершенно другим оперативным решением. Что вам нужно сделать, так это думать о электронной коммерции как о отдельном ограниченном контексте, так и в отделе, и, следовательно, у нее отдельная база данных.

Отдел: Продажи

Отдел: производство мяса

В этом случае продажам. Заказ имеет Sales.order_lines, который имеет продажи. Продукты, а продукт имеет поле описания, которое описывает мясной продукт

Если вам нужны данные о мясе от производства, то они будут отправлены в ваш DB продажи в качестве продукта. Спецификации

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top