web-dev-qa-db-fra.com

Conception relationnelle - plusieurs tables dans une colonne de clé étrangère?

Prenez une table qui suit les achats de viande. Il a une colonne de clé étrangère "viande_id" pour indiquer quel type de viande l'achat était.

Mais, les différents types de viande sont uniques d'une certaine manière (tels que le classement de l'USDA), je pense donc qu'ils devraient être stockés dans des tables différentes.

Je n'ai actuellement pas assez de représentant pour poster le erd que j'ai attiré, mais j'espère que ces DDL suffiront (je les ai simplifiées pour la brièveté):

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...

Je me demande comment relier la table "viande_purchas" aux tables de viande.

Standard SQL et RDBMS Agnostic répond seulement, s'il vous plaît.

6
tgxiii

Je pense que vous recherchez une construction de sous-type/superype. La viande serait votre clé de migration et contiendrait un champ de type qui indique quel sous-type de viande est liée à. Alors:

AchatMeat = viande = {utilbeef, viande de viande, bouée de viande}

Où la viande est le type et la clé du sous-type.

À la notation des pieds de Crow, c'est un cercle avec une ligne sous elle.

4
dba4life

Je ne créerais pas d'autres tables pour les différents types de viandes. Je créerais des types de viande et coupez des types, puis utilisez FKS pour les attacher tous ensemble. Échantillon DB ci-dessous:

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

CHEVAUX DE COURSE

Vous essayez de rejoindre une solution de commerce électronique avec une solution opérationnelle entièrement différente. Ce que vous devez faire est de penser au commerce électronique comme un contexte délimité séparé d'un département et il a donc une base de données distincte.

Département: Ventes

Département: Production de viande

Dans ce cas, une vente.order a des ventes.order_lines qui a des ventes.Products et le produit a un champ de description qui décrit le produit de la viande

Si vous avez besoin de détails de la viande de la production, ils seraient envoyés à vos ventes DB comme produit.Pécifications.

0
jim smith