SORU
21 EKİM 2011, Cuma


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
21 EKİM 2011, Cuma


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
)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Krumme1996

    Krumme1996

    21 EYLÜL 2009
  • National Geographic

    National Geo

    7 Mayıs 2006
  • warningthepeople

    warningthepe

    21 EYLÜL 2011