sql >> Database >  >> RDS >> Sqlserver

Foreign Key naar meerdere tabellen

Je hebt een paar opties, allemaal variërend in "juistheid" en gebruiksgemak. Zoals altijd hangt het juiste ontwerp af van uw behoeften.

  • U kunt eenvoudig twee kolommen maken in Ticket, OwnedByUserId en OwnedByGroupId, en voor elke tabel een nullable externe sleutel hebben.

  • U kunt M:M-referentietabellen maken die zowel ticket:gebruiker- als ticket:groeprelaties mogelijk maken. Misschien wilt u in de toekomst toestaan ​​dat een enkel ticket eigendom is van meerdere gebruikers of groepen? Dit ontwerp dwingt niet af dat een ticket moet eigendom zijn van slechts één enkele entiteit.

  • U kunt voor elke gebruiker een standaardgroep maken en tickets hebben die eenvoudigweg eigendom zijn van een echte groep of de standaardgroep van een gebruiker.

  • Of (mijn keuze) een entiteit modelleren die fungeert als basis voor zowel gebruikers als groepen, en tickets hebben die eigendom zijn van die entiteit.

Hier is een ruw voorbeeld met uw geposte schema:

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. 2 manieren om erachter te komen tot welk kwartaal een datum behoort in MariaDB

  2. SQL GROUP BY- 3 eenvoudige tips om resultaten te groeperen als een professional

  3. conversie van een varchar-gegevenstype naar een datetime-gegevenstype resulteerde in een waarde buiten het bereik

  4. Waarom is het uitvoeren van opgeslagen procedures sneller dan een SQL-query vanuit een script?