Привет TGM ,
В принципе, существует много способов моделирования базы данных, и ни один из них вообще не может быть объявлен лучшим. Оптимальный дизайн для любой базы данных зависит от контекста, в котором она будет использоваться.
Тем не менее, некоторые принципы кажутся согласованными больше, чем другие. По сути, лучший способ узнать о хорошем дизайне базы данных - это изучить дизайн, используемый в популярных приложениях. Подробнее об этом ниже.
Предварительный пример
Прежде чем потерять интерес, позвольте мне представить одну общую модель:
Изображение

SQL
CREATE TABLE items (
item_id INTEGER NOT NULL,
name VARCHAR NOT NULL,
description VARCHAR NOT NULL,
CONSTRAINT items_pk PRIMARY KEY (item_id)
);
CREATE TABLE users (
user_id INTEGER NOT NULL,
name VARCHAR NOT NULL,
username VARCHAR NOT NULL,
password VARCHAR NOT NULL,
email VARCHAR NOT NULL,
CONSTRAINT users_pk PRIMARY KEY (user_id)
);
CREATE TABLE ratings (
item_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
rating_id INTEGER NOT NULL,
timestamp TIMESTAMP NOT NULL,
CONSTRAINT ratings_pk PRIMARY KEY (item_id, user_id)
);
ALTER TABLE ratings ADD CONSTRAINT items_ratings_fk
FOREIGN KEY (item_id)
REFERENCES items (item_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE;
ALTER TABLE ratings ADD CONSTRAINT users_ratings_fk
FOREIGN KEY (user_id)
REFERENCES users (user_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE;
Примечание
В этой модели я использовал три таблицы. Важным элементом является то, что в таблице рейтингов два внешних ключа являются первичными ключами таблицы, поскольку именно эта пара ключей гарантирует, что пользователь может оценить элемент только один раз. Вы можете, конечно, добавить к списку первичных ключей rating_id, хотя это не окажет большого влияния на ограничение таблицы, которое вы упоминаете в своем вопросе.
Достаточно о моем дизайне. Давайте посмотрим, что вы действительно должны делать.
Лучшее решение
Вместо того, чтобы слепо полагаться на мнения других, вам следует потратить некоторое время и выяснить для себя, какие конструкции баз данных обычно используются в рейтинговых системах.
Вот что вы должны сделать:
Установите инструмент моделирования базы данных. Лично я предпочитаю SQL Power Architect - решение с открытым исходным кодом, позволяющее вам осуществлять обратный инжиниринг и перенаправление моделей баз данных в / из наиболее часто используемых баз данных. Этот инструмент также идеально подходит для работы с моделями баз данных. Схема в приведенном выше примере сделана с использованием SQL Power Architect .
Если вы предпочитаете другие решения, вы можете найти длинный список альтернативных инструментов на databaseanswers .
Если у вас его еще нет, установите пакет разработки сервера, например XAMPP или LAMP . Лично я предпочитаю использовать NginX и сам настраивать движки баз данных и языки программирования.
Найдите в Интернете программное обеспечение для оценки с открытым исходным кодом и установите его на своем сервере разработки. Если вам лень это делать, взгляните на следующие варианты: Рейтинговая система , Открытый рейтинг или PHP Stars .
Подключите SQL Power Architect к различным базам данных и используйте инженер-обратный инженер для изучения и сравнения различных решений.
Если вы выполните эти шаги, вскоре вы получите некоторые идеи о том, как настроить / смоделировать базу данных для вашего собственного рейтингового приложения.
Удачи в вашем проекте.