Регистрация действий в базе данных - схема и советы - MySQL - PullRequest
2 голосов
/ 24 августа 2011

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

Это хорошо? Я полагаю, это зависит от объема трафика, но не вызовет ли это проблем с непрерывными вставками? (Я думаю об использовании InnoDB для FK-ограничений)

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

Я думаю о чем-то вроде:

CREATE TABLE `logs` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `action` varchar(128) COLLATE utf8_bin NOT NULL,
 `user_id` bigint(20) unsigned DEFAULT NULL,
 `value` varchar(128) COLLATE utf8_bin DEFAULT NULL,
 `ip` varchar(40) COLLATE utf8_bin NOT NULL,
 `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 KEY `action` (`action`,`user_id`),
 CONSTRAINT `logs_ibfk_1` FOREIGN KEY (`action`) REFERENCES `logs_actions` (`name`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

CREATE TABLE `logs_actions` (
 `id` int(5) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) COLLATE utf8_bin NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

Это был бы хороший подход?

Ответы [ 4 ]

2 голосов
/ 24 августа 2011

user_id bigint(20), что!Вы разработчик на Facebook?;-) разве 4 байта не будет достаточно? См. MySql Числовые типы

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

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

1 голос
/ 24 августа 2011

  • Используйте таблицы MyISAM для ведения журнала, они разрешают одновременные запросы SELECT и INSERT - блокировка на уровне таблицы не будет мешать этим типам запросов.
  • В MySQL столбцам UTF-8 требуется 3 байта на символ, таким образом, столбец, который может содержать 128 символов UTF-8, фактически сможет хранить 128 * 3 = 384 байта, что большечем 256, таким образом, эти столбцы будут иметь 2 байта для подсчета количества символов в столбце, а не 1 байт (что, вероятно, то, что вы ожидали).
  • Используйте тип столбца INT для ip column - сэкономит много места и может значительно сократить время поиска.
  • Попробуйте объединить текстовые столбцы action & value в один столбец (возможно, с именем queryString, представляющий действие &значение пользователя на странице)
  • Наличие индекса с таким порядком столбцов:

    KEY `action` (`action`,`user_id`)
    

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

  • Я рекомендую узнать, как оптимизировать схему и запрос для MySQL, с помощью этой замечательной книги:

    High Performance MySQL: Optimi- Zation, Резервные копии, Репликациии многое другое, второе издание Барона Шварца и соавт.Авторские права 2008 O'Reilly Media, Inc., 9780596101718.

0 голосов
/ 30 ноября 2012

Также учтите следующее:

The TIMESTAMP data type is used for values that contain both date and time parts.
TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.

Извлечено из:

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

Отзыв:

http://2038bug.com/

Возможно, потребуется использовать DATETIME.

Привет.

0 голосов
/ 24 августа 2011

Я думаю, что MyIsam или Archive table больше подходят для регистрации. Потому что вам не нужно транзакции или одновременный доступ к таблице. Если вы не планируете удалять данные из таблицы, MyIsam позволит вам выполнить параллельную вставку, чтобы избежать блокировки всей таблицы.

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

Относительно схемы таблицы:

для хранения ip вы должны выбрать тип int и использовать функцию inet_aton. Смотри http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton

...