我正在尝试为个人项目创建一个简单的数据库,而且我不确定我是否正确使用了主键。
基本上,数据库包含对许多不同项目投赞成票/是投票的用户。
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将有两个主键,链接到另外两个表)
谢谢:)
答案 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
声明为唯一。但是,无论采用哪种方式,都有很好的理由,因此这更属于偏好。