Anahtar için birden çok yabancı tabloları
Benim veritabanında 3 ilgili tablolar var.
CREATE TABLE dbo.Group
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.User
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
Owner int NOT NULL,
Subject varchar(50) NULL
)
Kullanıcılar birden çok gruba ait. Bu da, daha çok bir ilişki yoluyla yapılır, ama bu durumda bir önemi yok. Bir bilet, bir grup ya da bir kullanıcı, okunur aktiviteler vasıtasıyla da ait olabilir.Bilet.Sahibi alan.
Bu ne olurduEN DOĞRUgidiş ilişkisini açıklamak ve bir kullanıcı veya bir grup isteğe bağlı olarak?
Sahibi ne diyor bu bilet tabloda bir bayrak eklemek gerektiğini düşünüyorum.
CEVAP
Birkaç seçenek, "doğruluk" ve kullanım kolaylığı. değişen var Her zaman olduğu gibi, doğru tasarım ihtiyaçlarınıza bağlıdır.
Bilet, OwnedByUserİd ve OwnedByGroupİd iki sütun basit oluşturun ve her bir tabloya null Sayılı olabilir.
M:M referans tabloları iki bilet etkinleştirme:kullanıcı ve bilet:grup ilişkileri oluşturabilirsiniz. Belki de gelecekte tek bir bilet birden fazla kullanıcı ya da gruplara ait izin isteyeceksiniz? Bu tasarım Uçak Bileti zorlamazgerekiryalnızca tek bir varlık sahibi olmak.
Her kullanıcı için varsayılan bir grup oluşturabilir ve Biletleri sadece doğru bir Grup veya bir Kullanıcı veya Grup ya ait.
Ya da (benim tercihim) Kullanıcılar ve Gruplar için bir üs olarak hareket eden bir varlık modeli ve bilet varlık tarafından sahibi.
İşte kaba bir örnek gönderildi şeması kullanılarak:
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 NOT NULL,
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 NOT NULL,
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 NOT NULL,
[Owner] int NOT NULL references dbo.Party(PartyId),
[Subject] varchar(50) NULL
)
Ben başvuru belirli bir tablo yabancı ...
Yabancı anahtar kısıtlaması devir veya...
Nasıl SQL Server yabancı anahtar bağım...
Nasıl geçici olarak MySQL yabancı anah...
Olası Olası iki tablo için MySQL yaban...