数据库 - 我这样做对吗?

时间:2015-04-04 18:49:22

标签: sql key

我正在尝试为个人项目创建一个简单的数据库,而且我不确定我是否正确使用了主键。

基本上,数据库包含对许多不同项目投赞成票/是投票的用户。

Example : 
User "JOHN" voted YES on item_1 and item_2, but voted FALSE on item_3. 
User "BOB" voted YES on item_1 and item_6.
User "PAUL" votes NO on item_55 and item_76 and item_45.

我想使用以下3个表(PK表示主键):

1) table_users, which contains the columns "PK_userID" and "name"
2) table_items, which contains the columns "PK_itemID" and "item_name"
3) table_votes, which contains the columns "PK_userID", "PK_itemID", and "vote"

将链接具有相同名称的列

它看起来像是使用主键的正确方法吗? (因此table_votes将有两个主键,链接到另外两个表)

谢谢:)

3 个答案:

答案 0 :(得分:0)

由于用户可以为多个项目投票,并且多个用户可以为单个项目投票,因此您不应在第三个表table_votes中创建以下两个主键。只需将它们创建为字段,否则它将限制您只添加一次userId或itemId。是的,你应该让它们 NOT NULL

"PK_userID", "PK_itemID",

答案 1 :(得分:0)

不,这不正确。

每个表只能有一个主键。您可以使用具有唯一索引的其他列,这些索引可能是候选键,但这不是主键。

我认为你有三张桌子:

create table PERSON (
    PERSON_ID int not null identity,
    primary key(PERSON_ID)
);

create table ITEM (
    ITEM_ID int not null identity,
    primary key(ITEM_ID)
);

create table VOTE (
    PERSON_ID int,
    ITEM_ID int,
    primary key(PERSON_ID, ITEM_ID),
    foreign key(PERSON_ID) references PERSON(PERSON_ID),
    foreign key(ITEM_ID) references ITEM(ITEM_ID)
);

这是基数问题。一个人可以对很多项目进行投票;一个项目可以由许多人投票。

select p.PERSON_ID, i.ITEM_ID, COUNT(*) as vote_count
from PERSON as p
join VOTE as v
on p.PERSON_ID = v.PERSON_ID
join ITEM as i
on i.ITEM_ID = v.PERSON_ID
group by p.PERSON_ID, i.ITEM_ID

答案 2 :(得分:0)

这看起来很合理。但是,我不建议您使用" PK _"来命名您的主键。字首。这可能会令人困惑,特别是因为我建议给外键和主键指定相同的名称(这种关系很明显)。相反,只需在Id作为后缀的表后面命名。我建议使用这样的表结构:

create table Users (
     UserId int not null auto_increment primary key,
     Name varchar(255)  -- Note:  you probably want this to be unique
);

create table Items (
     ItemId int not null auto_increment primary key,
     ItemName varchar(255)  -- Note:  you probably want this to be unique
);

create table Votes (
     UserId int not null references Users(UserId),
     ItemId int not null references Items(ItemId),
     Votes int,
     constraint pk_UserId_ItemId primary key (UserId, ItemId)
);

实际上,我倾向于在Votes中使用自动递增的主键,并将UserId, ItemId声明为唯一。但是,无论采用哪种方式,都有很好的理由,因此这更属于偏好。