2015-04-04 2 views
0

Я пытаюсь создать простую базу данных для личного проекта, и я не уверен, правильно ли использую первичные ключи.База данных - Я делаю это правильно?

В принципе, база данных содержит пользователей, у которых есть да/нет на разных позициях.

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

Поскольку пользователь может голосовать за нескольких элементов и многочисленные пользователи могут голосовать за одного пункта, вы не должны создавать после двух основных ключей в третьей таблице table_votes. Просто создайте их как поля, иначе он ограничит вас добавлением только userId или itemId только один раз. Да, вы должны сделать их NOT NULL

"PK_userID", "PK_itemID", 
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 
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 объявлен как уникальные. Однако есть хорошие аргументы в пользу этого в любом случае, так что это скорее вопрос предпочтения.

Смежные вопросы