Хранение данных действий пользователя в MySQL: одна таблица или много? - PullRequest
3 голосов
/ 07 сентября 2010

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

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

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

Наконец, я оптимизирую скорость, а не размер.Как мне подойти к этой дилемме?

1 Ответ

1 голос
/ 08 сентября 2010

Обычно избегание объединений в больших таблицах является хорошей практикой для повышения скорости, но это действительно зависит от вашего использования.

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

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

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

...