3个表之间的sql server关系

时间:2014-06-28 15:23:35

标签: sql sql-server

我想为修饰店创建这些表格:

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,但它是否也有宠物信息?如果每次约会可以有超过1只宠物,而且超过每只宠物的约会...当我想让UserInfo指向Pets表时,因为每个用户至少有一只宠物。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以在petID表中添加appoinment,但不需要它,因为您可以链接appoinment - > userinfo使用UserInfoId关系,然后您可以关联userinfo - > pets使用petid关系。

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

答案 2 :(得分:0)

由于每个用户都有一个或多个宠物,而宠物可能只有一个所有者,我建议您将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)
    );

答案 3 :(得分:0)

你应该知道打算如何使用这些表,也就是你的business rules。然后,您将拥有更好的桌面设计。如果您不确定,那么您可能需要重新设计表格。

以下是需要考虑的一些要点:

  1. 您不想为他们拥有的每只宠物重复用户信息,对吧? (标准化)

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

  3. 您可以将用户信息拆分为两个表 - userinfo和useraddress表,并将它们与用户ID相关联,因为同一家庭中的家人可以共享宠物。 (标准化)

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