Вход в файл или в таблицу базы данных?

12

Я разрабатываю веб-приложение, которое использует MS SQL для различных данных: включая пользователей, учетные записи пользователей, пользовательские лицензии, цены на лицензии, счета.

Мне нужно регистрировать использование системой пользователей в режиме реального времени и использовать это для ежемесячного выставления счетов: например, регистрировать каждый раз, когда пользователь получает определенную страницу / URL и выставлять счета пользователям в конце месяца на основе количества страниц, которые они получили.

  • Должен ли я записать эти события журнала в таблицу в моей базе данных MS SQL?

  • Должен ли я записывать эти события журнала в файл журнала не только для добавления в приложение?

  • Должен ли я записывать эти события журнала в отдельный файл журнала для каждого пользователя?

Это не особо объемный веб-сайт: например, максимум 10 000 пользователей, каждый из которых выполняет в среднем 5 регистрируемых событий / день => 50 000 событий / день = 30 событий / минуту = 18 000 000 событий / год.

Я спрашиваю, потому что любой вариант кажется жизнеспособным, и я не вижу, есть ли у кого-то явное преимущество.

Данные, связанные с оплачиваемым событием, просты, например:

  • ID пользователя (отношение внешнего ключа к таблице Users в SQL)
  • Дата и время
  • URL оплачиваемой страницы

Мой собственный ответ на этот вопрос следующий:

  • Некоторые преимущества записи журнала в таблицу базы данных:

    • Реляционная целостность: например, зарегистрированные события связаны с действительными идентификаторами пользователя (путем определения идентификатора пользователя в качестве внешнего ключа между таблицами)
    • Легко читается для выставления счетов: например, SELECT COUNT GROUP BYдля подсчета количества событий журнала на пользователя
  • Некоторые преимущества записи в файл журнала:

    • Повышенная производительность: SQL используется реже, например, только для событий входа пользователя в систему, и в основном используется только для чтения
    • Более простое управление: проще архивировать старые данные, например, в конце года, перемещая старые файлы журнала, а не удаляя / архивируя из базы данных

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

И / или, пожалуйста, дайте мне знать, каков ваш ответ, если он отличается от моего.

ChrisW
источник
3
Вам необходимо отделить информацию, используемую для принятия бизнес-решений, от общей информации ведения журнала. Сохраняйте все, что позже будет использовано вашим приложением, в базе данных, а все остальное - в файлах журналов.
Том
1
Если вы используете хорошо известный пакет, такой как log4net - и это, вероятно, будет хорошей идеей, а не развертыванием вашей собственной - это просто вопрос переключения конфигурации. @tom - разделение это хорошо, но почему бы просто не иметь две базы данных, одну для оперативных данных, другую для архивирования журналов и т. д.?
Джулия Хейворд
2
ОП говорит, что он предназначен для ежемесячного выставления счетов - поэтому я ожидал, что применение логики выставления счетов к БД будет намного проще, чем плоские файлы?
Джулия Хейворд
1
Вы использовали термин «SQL», когда имели в виду «база данных». Я сделал некоторые исправления. SQL - это язык, который вы используете для чтения и записи в базы данных. MS SQL Server - это имя СУБД. «SQL» сам по себе не означает «база данных MS SQL Server».
Тулаинс Кордова
1
@gnat Я не думаю, что это дубликат: другой был связан с регистрацией ошибок, тогда как речь идет об использовании логинга для выставления счетов (и в этом случае ответ был принят с использованием СУРБД).
ChrisW

Ответы:

13

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

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

Кстати, ваш третий вариант - сделать и то, и другое. Используйте базу данных для большинства нужд, но используйте файл журнала для целей аудита.

GrandmasterB
источник
3
Еще одним бонусом к использованию базы данных является использование триггеров для определенной регистрации. Никакого дополнительного кода не потребуется. Если данные вставляются в таблицу A, вставьте в журнал сообщение X.
Greg Burghardt