Relationales Design - Mehrere Tabellen in einer Fremdschlüsselspalte?
-
16-10-2019 - |
Frage
Nehmen Sie einen Tisch, der Fleischkäufe verfolgt. Es hat eine "Meat_Id" -Auskey -Spalte, um anzuzeigen, welche Art von Fleisch der Kauf war.
Aber die verschiedenen Fleischarten sind in irgendeiner Weise einzigartig (z. B. USDA -Einstufung), daher denke ich, dass sie in verschiedenen Tischen gespeichert werden sollten.
Ich habe derzeit nicht genug Repräsentanten, um die von mir herausgezogene ERD zu veröffentlichen, aber ich hoffe, diese DDLs werden ausreichen (ich habe sie für die Kürze vereinfacht):
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...
Ich frage mich, wie man den Tisch "Meat_Purchases" mit den Fleischtischen bezieht.
Nur Standard -SQL- und RDBMS Agnostic Antworten, bitte.
Lösung
Ich denke, Sie suchen ein Subtyp/SuperType -Konstrukt. Fleisch wäre Ihr migrierender Schlüssel und würde ein Typfeld enthalten, das angibt, auf welchen Untertyp Fleisch es sich bezieht. So:
KaufaMeat = fleisch = {fleischbeeef, fleischpork, fleischpultry}
Wo Fleisch der Typ und der Schlüssel des Subtyps ist.
In Crows Füße Notation ist dies ein Kreis mit einer Linie darunter.
Andere Tipps
Ich würde keine anderen Tische für die unterschiedliche Art von Fleisch erstellen. Ich würde Fleischtypen erstellen und Typen schneiden und dann mit FKs alle zusammenbinden. Beispiel DB unten:
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
PFERDE FÜR KURSE
Sie versuchen, einer E-Commerce-Lösung mit einer völlig anderen operativen Lösung beizutreten. Was Sie tun müssen, ist, E-Commerce als einen separaten begrenzten Kontext zu betrachten, auch als Abteilung, und daher verfügt sie über eine separate Datenbank.
Abteilung: Verkauf
Abteilung: Fleischproduktion
In diesem Fall hat ein Vertrieb einen Vertrieb. Order_lines mit Verkaufs.produkten und Produkten ein Beschreibung Feld, das das Fleischprodukt beschreibt
Wenn Sie Fleischdetails aus der Produktion benötigen, werden sie an Ihre Verkaufsdb als Produkte gesendet. Spezifikationen