Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Външен ключ към множество таблици

Имате няколко опции, като всички се различават по "правилност" и лекота на използване. Както винаги, правилният дизайн зависи от вашите нужди.

  • Можете просто да създадете две колони в Ticket, OwnedByUserId и OwnedByGroupId, и да имате нулеви външни ключове към всяка таблица.

  • Можете да създадете референтни таблици M:M, позволяващи както билет:потребител, така и билет:група. Може би в бъдеще ще искате да разрешите един билет да бъде притежаван от множество потребители или групи? Този дизайн не налага, че билетът трябва да бъде собственост само на едно лице.

  • Можете да създадете група по подразбиране за всеки потребител и да имате билети, просто собственост на истинска група или група по подразбиране на потребител.

  • Или (по мой избор) моделирайте обект, който действа като база както за потребители, така и за групи и има билети, притежавани от този обект.

Ето един груб пример за използване на публикуваната от вас схема:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да коригирате „Свързаната функция за дял генерира повече дялове, отколкото има файлови групи, споменати в схемата“ Msg 7707 в SQL Server

  2. Параметризирайте SQL IN клауза

  3. Как да групирам по непрекъснати диапазони

  4. Проактивни проверки на състоянието на SQL Server, част 5:Статистика за изчакване

  5. Неправилен синтаксис близо до ')', извикващ съхранена процедура с GETDATE