sql >> Database teknologi >  >> RDS >> Sqlserver

Fremmednøgle til flere borde

Du har et par muligheder, der alle varierer i "korrekthed" og brugervenlighed. Som altid afhænger det rigtige design af dine behov.

  • Du kan simpelthen oprette to kolonner i Ticket, OwnedByUserId og OwnedByGroupId og have nullable fremmednøgler til hver tabel.

  • Du kan oprette M:M-referencetabeller, der aktiverer både billet:bruger og billet:gruppe-relationer. Måske vil du i fremtiden tillade, at en enkelt billet ejes af flere brugere eller grupper? Dette design håndhæver ikke, at en billet skal kun ejes af en enkelt enhed.

  • Du kan oprette en standardgruppe for hver bruger og få billetter, der simpelthen ejes af enten en ægte gruppe eller en brugers standardgruppe.

  • Eller (mit valg) modellere en enhed, der fungerer som en base for både brugere og grupper, og har billetter, der ejes af denne enhed.

Her er et groft eksempel med dit indsendte skema:

create table dbo.PartyType
(   
    PartyTypeId tinyint primary key,
    PartyTypeName varchar(10)
)

insert into dbo.PartyType
    values(1, 'User'), (2, 'Group');


create table dbo.Party
(
    PartyId int identity(1,1) primary key,
    PartyTypeId tinyint references dbo.PartyType(PartyTypeId),
    unique (PartyId, PartyTypeId)
)

CREATE TABLE dbo.[Group]
(
    ID int primary key,
    Name varchar(50) NOT NULL,
    PartyTypeId as cast(2 as tinyint) persisted,
    foreign key (ID, PartyTypeId) references Party(PartyId, PartyTypeID)
)  

CREATE TABLE dbo.[User]
(
    ID int primary key,
    Name varchar(50) NOT NULL,
    PartyTypeId as cast(1 as tinyint) persisted,
    foreign key (ID, PartyTypeId) references Party(PartyID, PartyTypeID)
)

CREATE TABLE dbo.Ticket
(
    ID int primary key,
    [Owner] int NOT NULL references dbo.Party(PartyId),
    [Subject] varchar(50) NULL
)


  1. Ting at vide om databasedrevne websteder

  2. Bestemmelse af, om feltdataene i Oracle er af nummertypen

  3. På opgraderingsmetoden bliver ikke kaldt i android sqlite

  4. Sådan returneres rækker, der har de samme kolonneværdier i MySql