Предложение по улучшению реляционной схемы БД - PullRequest
1 голос
/ 02 августа 2010

Я здесь для того, чтобы разработать схему реляционной базы данных, которая моделирует опрос и пользователей.Каждая категория может иметь один или несколько вопросов.Каждый пользователь может участвовать только один раз в каждой категории и может опрашивать (или нет) ровно один раз по каждому вопросу.Каждый опрос - да, нет или воздержался (без голосования).

Я разработал свою схему с четырьмя таблицами:

 users, [userId, IP]
 category, [catId, catTitle]
 question, [queId, queTitle]
 polls [pollId, queId, userId, answer]

лучше или

 users, [userId, IP]
 category, [catId, catTitle]
 question, [queId, queTitle]
 polls [pollId, catId, userId]
 pollAnswers [pollAndId, queId, pollId, answer]

Я хотел бы знать, какой из них лучше и почему?

по моему мнению, поскольку у меня нет какой-либо дополнительной информации о опросах, я непосредственно пересекаюсь, объединяя пользователей и вопросы с ответом.

Я также делаюнужно выяснить, сколько пользователей воздержалось при a.) вопросе по всей категории b.) конкретной категории c.) конкретном вопросе

У меня есть точка зрения на схему выбора 1:

select U1.*, Q1.*, P2.*, C1.*
from 
    ( users U1, 
    questions Q1 )
    Left outer Join polls P2 on 
        Q1.queId = P2.queId AND U1.userId = P2.userId
    Left Outer Join category C1 on
        Q1.catId = C1.catId

Я пытаюсь беспокоиться, используя приведенный выше запрос с перекрестным соединением между пользователями, и вопрос потеряет мою производительность или нет?

Если вторая схема лучше, можете ли вы предложить варианты для моих результатов?

Ответы [ 2 ]

0 голосов
/ 31 марта 2014

пользователи: переименуйте пользователя, чтобы все сущности были единичными (или переименовали единственное число во множественное)

категория: ОК

вопрос: Вам нужен внешний ключ от вопроса к категории

pollAnswers: переименуйте в pollAnswer и сделайте его справочной таблицей с тремя строками: Да, Нет, Воздержитесь

опросы: Переименуйте в опрос и сделайте это транзакцией пользователя, опрашивающего вопрос, с иностраннымключи к пользователю, вопрос и опрос.

(Опции: либо подтвердите на вставке, что у пользователя нет существующих опросов для вопросов в категории, либо денормализуйте ответы PollAnswers с помощью внешнего ключа вопроса к категории и наложите уникальное ограничение на пользователя / вопрос. Я не делаюлично мне нравится эта опция, потому что она представляет проблемы при изменении категории вопроса.)

Тогда запрос для определенной категории может выглядеть следующим образом:

select *
from category c
LEFT OUTER JOIN question q ON q.catID = c.catID
LEFT OUTER JOIN poll p ON p.queId = q.queId
LEFT OUTER JOIN user u ON u.userId = p.UserID
WHERE c.catID = 'blah blah'
0 голосов
/ 02 августа 2010

Посмотрите на аналогичный вопрос, дизайн базы данных для опроса .

...