2014-09-19 3 views
0

У меня есть два способа, которыми я мог бы настроить свою базу данных, и я вижу преимущества в обоих, но я не уверен, какой способ считается «правильным путем». Это касается системы с большими пальцами, как в стиле Youtube, просто для того, чтобы сделать ее понятной, для моего веб-сайта.Эффективность базы данных

Первая идея для сервировки стола (базовый пример)

USER = user_id, etc<br> 
PROJECT = project_id, user_id, etc<br> 
PROJECTLIKE = project_like_id, project_id, user_id etc<br> 
PROJECTDISLIKE = project_dislike_id, project_id, user_id etc 

Вторая идея для сервировки стола (базовый пример)

USER = user_id, etc,<br> 
PROJECT = project_id, user_id, etc<br> 
PROJECTLIKEDISLIKE = project_dislikelike_id, project__id, user_id, like (boolean), etc 

Я чувствую, первый из них будет более эффективным, но второй будет проще писать код для. Есть лучший способ или это просто предпочтение.

рассматривает

+0

База данных должна быть разработана на основе того, как данные будут использоваться. В вашем вопросе не указаны шаблоны использования. –

+0

Я вижу вашу точку зрения, спасибо за ответ – Mike

+0

Этот вопрос кажется не по теме, потому что речь идет о дизайне, а не о кодировании .. с недостаточной информацией даже дать рекомендацию по дизайну – ErstwhileIII

ответ

1

учитывая, что вы вряд ли нравится и не нравится что-то в то же время, одна таблица для «сродства проекта» могли бы сделать эту работу.

Это также имеет то преимущество, что у него больше возможностей: «Как», «Не нравится» или даже «Мех» можно легко включить.

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

+0

спасибо за ваш ответ, отличный пример, который покачал мне один стол. Thoug сделал бы два столовых решения более перспективными в плане нормализации изменений базы данных по линии (если это имеет смысл. – Mike

+0

Решение для двух таблиц было бы более трудным для поддержания и меньшего будущего доказательства. Это также означает запрос двух разных таблиц к узнайте, что чье-то мнение о чем-то было, что может чрезвычайно осложнить любые операции «JOIN», которые у вас могут быть. Это нарушение правила [Zero, One или Infinity Rule] (http://en.wikipedia.org/wiki/Zero_one_infinity_rule). Нет двух. – tadman

1

Вы, вероятно, будете хотеть

CREATE TABLE vote_types (
    vote_type INT, 
    vote_type_desc VARCHAR(32) 
); 

CREATE TABLE project_votes (
    project_id BIGINT, 
    user_id BIGINT, 
    vote INT, 
    PRIMARY KEY (project_id, user_id) 
); 

CREATE INDEX project_votes_aggregated (project_id, vote); 

SELECT vote, count(*) FROM project_votes WHERE project_id = ? GROUP BY vote; 

Этот индекс будет замедляться вставками немного, но сделать это SELECT очень быстро. Здесь, как вы индексируете вещи, на самом деле является ключом к эффективности. Схема больше связана с проблемой нормализации.

+0

Больше вопроса conecpt, чем любой код, но спасибо за ваш ответ – Mike

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