Таблица базы данных с множеством строк - правильное использование - PullRequest
1 голос
/ 24 октября 2011

Это скорее теоретический вопрос, и я думаю, что лучше всего начать с примера.

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

Мой способ решения этой проблемы будет иметь такую ​​таблицу:

rating_id | user_id | item_id | rating | date

В этой таблице хранятся все рейтинги и некоторые другие необходимые данные. В этом случае, если есть 10 тыс. Пользователей и 10 тыс. Элементов, таблица будет очень длинной, и в дополнение к этому мне нужно будет использовать несколько JOIN для определения имени пользователя и названий элементов, которые он оценил. Так что, думаю, это заняло бы много времени.

Я на правильном пути или есть лучшее решение моей проблемы?

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Привет TGM ,

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

Предварительный пример

Прежде чем потерять интерес, позвольте мне представить одну общую модель:

Изображение

An example database model

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, хотя это не окажет большого влияния на ограничение таблицы, которое вы упоминаете в своем вопросе.

Достаточно о моем дизайне. Давайте посмотрим, что вы действительно должны делать.

Лучшее решение

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

Вот что вы должны сделать:

  1. Установите инструмент моделирования базы данных. Лично я предпочитаю SQL Power Architect - решение с открытым исходным кодом, позволяющее вам осуществлять обратный инжиниринг и перенаправление моделей баз данных в / из наиболее часто используемых баз данных. Этот инструмент также идеально подходит для работы с моделями баз данных. Схема в приведенном выше примере сделана с использованием SQL Power Architect .

    Если вы предпочитаете другие решения, вы можете найти длинный список альтернативных инструментов на databaseanswers .

  2. Если у вас его еще нет, установите пакет разработки сервера, например XAMPP или LAMP . Лично я предпочитаю использовать NginX и сам настраивать движки баз данных и языки программирования.

  3. Найдите в Интернете программное обеспечение для оценки с открытым исходным кодом и установите его на своем сервере разработки. Если вам лень это делать, взгляните на следующие варианты: Рейтинговая система , Открытый рейтинг или PHP Stars .

  4. Подключите SQL Power Architect к различным базам данных и используйте инженер-обратный инженер для изучения и сравнения различных решений.

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

Удачи в вашем проекте.

0 голосов
/ 24 октября 2011

В таблице будет только столько строк, сколько элементов оценивает каждый пользователь. Сколько это будет? Лично я бы не оценил 10000 предметов. Я могу поставить оценку 20, 30 или 100. Старые оценки могут быть бесполезны, поэтому вы можете удалить некоторые из них. (Трехлетний рейтинг шампуня обычно бесполезен; формулы шампуня постоянно меняются.)

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

Что-то в этом духе должно быть хорошо для начала.

create table ratings (
  user_id integer not null, -- references users (user_id), not shown
  item_id integer not null, -- references items (item_id), not shown
  primary key (user_id, item_id),
  rating integer not null check (rating between 1 and 5) -- ?
  date_rated date not null default current_date
);

create index on ratings (date_rated);

Ваш следующий шаг, вероятно, будет разбиение .

...