Relazionale Design - tavoli multipli in una colonna chiave esterna?
-
16-10-2019 - |
Domanda
Prendere una tabella che gli acquisti tracce di carne. Ha una colonna chiave esterna "meat_id" per indicare quale tipo di carne l'acquisto è stato.
Ma, i diversi tipi di carne sono uniche in qualche modo (come USDA grading), così sto pensando che devono essere conservati in tabelle differenti.
Attualmente non ho abbastanza rep per pubblicare il disco di ripristino ho disegnato, ma spero che queste DDL saranno abbastanza (io li ho semplificato per brevità):
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...
mi chiedo come mettere in relazione le "meat_purchases" tabella per le tabelle di carni.
standard SQL e RDBMS solo risposte agnostiche, per favore.
Soluzione
Credo che siete alla ricerca di un costrutto sottotipo / supertipo. Carne sarebbe la chiave di migrazione e conterrebbe un campo Type che indica quale sub-tipo di carne si riferisce a. Quindi:
PurchaseMeat = Carne = {MeatBeef, MeatPork, MeatPoultry}
dove la carne è il tipo e la chiave del sottotipo.
zampe di gallina In notazione questo è un cerchio con una linea sotto di esso.
Altri suggerimenti
Non vorrei creare altri tavoli per i diversi tipi di carni. Vorrei creare tipi di carne e tipi di taglio e quindi utilizzare FKS per legare tutti insieme. DB esempio riportato di seguito:
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
cavalli per i corsi
Si sta tentando di unirsi a una soluzione di e-commerce con una soluzione operativa completamente diverso. Quello che dovete fare è pensare a e-commerce come un contesto limitato separata aka un reparto e quindi ha un database separato.
Dipartimento: VENDITE
Dipartimento: CARNI DI PRODUZIONE
In questo caso una sales.order ha sales.order_lines che ha sales.products, e il prodotto ha un campo di descrizione che la descrive il prodotto a base di carne
Se avete bisogno di informazioni a base di carne dalla produzione allora sarebbero inviati verso le vendite DB come product.specifications