Вопрос оптимизации модели SQL - PullRequest
0 голосов
/ 13 апреля 2010

Мне нужно отслеживать количество «попаданий» по конкретному элементу в БД. Дело в том, что «попадания» должны оставаться уникальными с идентификатором пользователя, поэтому, если пользователь нажимает на предмет 3 раза, он все равно должен учитываться как 1.

Кроме того, мне нужно отобразить общее количество попаданий для определенного элемента.

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

Ответы [ 3 ]

1 голос
/ 13 апреля 2010

Создать новую таблицу hits со столбцами thing_id и user_id. Добавьте уникальный индекс для thing_id и user_id. Затем вы можете обновить таблицу с помощью этого запроса:

INSERT INTO hits (user_id, thing_id) VALUES (?, ?)

Из-за индекса, который будет либо добавлять строку, либо ничего не делать (если вы можете указать ON CONFLICT IGNORE или эквивалент при определении таблицы, это позволит избежать ошибок). Вы можете получить количество посещений с помощью этого запроса:

SELECT COUNT(*) FROM hits WHERE thing_id = ?
1 голос
/ 13 апреля 2010

Нет, хранение информации, разделенной запятыми в базе данных, почти никогда не лучше и почти всегда намного, намного, намного хуже, чем альтернатива.хит (есть ли дополнительная информация к нему), или просто количество на пользователя?Если первое верно, используйте таблицу со столбцами thing_id и user_id (плюс столбцы для других атрибутов, которые относятся к «попаданию»).Если второе значение true, используйте таблицу со столбцами thing_id, user_id и hit_count и используйте команду UPDATE, например:

UPDATE hit_count_table SET hit_count = hit_count + 1
   WHERE user_id = :userid AND thing_id = :thingid;
0 голосов
/ 13 апреля 2010

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

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

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

Вы никогда не должны хранить вещи в базе данных как строки "CSV" - это полный кошмар для запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...