Реляционный дизайн - несколько таблиц в один столбец иностранного ключа?
-
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 продажи в качестве продукта. Спецификации