繁体   English   中英

3个表之间的sql server关系

[英]sql server relationships between 3 tables

我要为美容店创建以下表:

CREATE TABLE Pets(

    Id int NOT NULL PRIMARY KEY IDENTITY
    ,Name varchar(20)
    ,Breed varchar(35)
    ,[Weight] decimal (10,2) NOT NULL
    ,Cat bit NOT NULL
    ,Dog bit NOT NULL
)

CREATE TABLE UserInfo(

    Id int NOT NULL PRIMARY KEY IDENTITY
    ,FirstName varchar(15) NOT NULL
    ,LastName varchar(30) NOT NULL
    ,PhoneNumber varchar(10) NOT NULL
    ,EmailAddress varchar(30) NOT NULL
    ,AddressId int NOT NULL FOREIGN KEY REFERENCES [Address](Id)--Address Table already created
    ,PetId int NOT NULL FOREIGN KEY REFERENCES Pets(Id)
)

CREATE TABLE Appointments(

    Id int NOT NULL PRIMARY KEY IDENTITY
    ,[Date] date NOT NULL
    ,UserInfoId int NOT NULL FOREIGN KEY REFERENCES UserInfo(Id)
    ,PetId int NOT NULL FOREIGN KEY REFERENCES Pets(Id)--?
)

我的约会表将具有UserInfo,但还应具有Pets信息吗? 如果每个约会可以有1个以上的宠物,并且每个宠物都可以有多个约会...当我希望UserInfo指向Pets表时,因为每个用户将至少有一个宠物。

不,您不需要在约会表中包含宠物信息,因为可以从UserInfo表本身中检索与宠物有关的信息。

您可以在appoinment表中有petIDappoinment不是必需的,因为您可以使用UserInfoId关系链接appoinment > userinfo ,然后可以使用petid关系链接userinfo > pets

这种情况是众所周知的Transitive relationship 即,如果存在A -> B and B -> C ,则可以形成A -> C

由于每个用户将拥有一个或多个宠物,并且一个宠物大概只有一个所有者,因此我建议您将UserInfoId添加到Pets表中,并从UserInfo表中删除PetId。 我还建议您从“约会”表中删除“ PetId”,并为约会中包含的宠物创建一个单独的表。 因此,约会实际上是与主人一起进行的,主人可能会带来一只或多只宠物。

CREATE TABLE UserInfo(
     Id int NOT NULL PRIMARY KEY IDENTITY
    ,FirstName varchar(15) NOT NULL
    ,LastName varchar(30) NOT NULL
    ,PhoneNumber varchar(10) NOT NULL
    ,EmailAddress varchar(30) NOT NULL
    ,AddressId int NOT NULL FOREIGN KEY REFERENCES [Address](Id)
);

CREATE TABLE Pets(
     Id int NOT NULL PRIMARY KEY IDENTITY
    ,UserInfoId int NOT NULL FOREIGN KEY REFERENCES UserInfo(Id)
    ,Name varchar(20)
    ,Breed varchar(35)
    ,[Weight] decimal (10,2) NOT NULL
    ,Cat bit NOT NULL
    ,Dog bit NOT NULL
);

CREATE TABLE Appointments(
     Id int NOT NULL PRIMARY KEY IDENTITY
    ,[Date] date NOT NULL
    ,UserInfoId int NOT NULL FOREIGN KEY REFERENCES UserInfo(Id)
);

CREATE TABLE AppointmentPets(
     AppointmentId int NOT NULL
    ,PetId int NOT NULL
    CONSTRAINT PK_AppointmentPets PRIMARY KEY(AppointmentId, PetId)
    );

您应该知道打算如何使用这些表,即您的business rules是什么。 然后,您将为您的桌子设计更好。 如果不确定,则可能必须重新设计表。

这里有几点要考虑:

  1. 您不想为每只宠物重复用户信息,对吗? (正常化)

  2. 您可以在单独的表或约会表中将用户映射到宠物。 用户和宠物之间可能有多对多的关系,即多个用户拥有一个宠物,而一个用户拥有多个宠物。 您可以将用户链接到单独表中的宠物。

  3. 您可以将用户信息分成两个表-userinfo和useraddress表,并用用户ID链接它们,因为同一家庭中的家人可以共享一只宠物。 (正常化)

  4. 用动物栏代替猫栏,狗栏。 (次要建议)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM