2014-02-04 3 views
0

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

Проблема очевидна: «Мы хотим регистрировать каждое действие пользователя» - возможно, когда мы решаем большую проблему, более мелкие (например, для регистрации только одно действие будет куском торта).

Во-первых от того, что я прочитал через веб и стека переполнения:

Использование БД вместо файла: Это хороший совет, хотя это всегда зависит от ситуации. Но из-за многих преимуществ БД, в долгосрочной перспективе и в целом, это лучшее решение.

Уровень БД или прикладной уровень: На самом деле это зависит. Например, если вы хотите действительно контролировать все (я имею в виду, действительно, каждая строка, которая изменяется в базе данных, кажется, у нас будет один выбор «Использование триггеров базы данных». Хотя в MySQL много дискуссий, которые говорят, запускают замедление БД, и они советуем не использовать его. Таким образом, это зависит от уровня детализации, который вам нужен, вы можете поместить свою систему регистрации в DB Layer или Уровень приложения (для экзамена используется обычный вызов функции $ logClass-> logThis()).

Использование наблюдателей: Чистые коды всегда лучше. Если вы знакомы с наблюдателями, вы можете использовать их, чтобы делать что-то для вас, когда произошло действие, поэтому вам не нужно добавлять $ logClass-> logThis() каждый раз, когда CRUD происходит в вашем приложении.

Что нужно Log: Простой и короткий ответ: Исходя из ваших потребностей, но есть некоторые общие поля вам понадобятся:

  • user_id (, если уникальный идентификатор пользователя доступен)
  • метка времени (Unix может быть)
  • ф (не все знают, как фальсифицировать это в первую очередь, так что используйте его, даже притворяется я т дать вам некоторое представление о поведении пользователей)
  • action_id (должны быть предопределенные действия для лучшего объединяющим в запросах и отчетах)
  • object_id (уникальный идентификатор строки из записи, что изменения были сделаны на)
  • действие (, который мой вопрос об этой части)
  • и т.д ...

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

И теперь мой вопрос: Как хранить действия?. Для лучшего понимания рассмотрите следующий сценарий.

У меня есть таблица под названием «продукт» и таблица под названием «компании». Из бизнес-логики мы хотим присвоить продукты компаниям, которые мы оказались в таблице «company_product». Теперь, когда пользователь вставить новый продукт и одновременно назначить его компании, 2 таблицы будут затронуты (то же самое для удаления и обновления): «продукт» и «company_product», и мы хотим знать:

  • что вставлено?
  • Что удалено?
  • Что обновлено до чего?

Для проблемы производительности и потому, что не хватает знаний о триггерах, я хочу использовать протоколирование в прикладном уровне, так что я в конечном итоге с этой идеей, что я могу, сохранить поля действий по базе данных в массив или json структура. Но по мере того как я разработал свое решение, я столкнулся с проблемой: Как сделать этот журнал понятным для нетехнических пользователей? Так, например, я хочу, чтобы сохранить что-то подобное в действии поля базы данных, когда удаление (вставка) продукта с идентификатором 20:

action : [{id: 20, product_id:2, company_id: 1},{id: 21, product_id:2, company_id: 2}] 

И это не то, что легко каждый читать и понимать. На самом деле я могу использовать этот JSON более читаемым и сделать это что-то вроде этого:

action : {'Product A Deleted From Company X', 'Product A Deleted From Company Y'} 

и сохранить предыдущее действие в поле technical_action для дальнейшей диагностики, но это требует дополнительных работ и больше запросов для выполнения чего-то, что не всегда (log)

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

+0

Прокомментируйте комментарий -1 на этом сообщении, поэтому я знаю, что не так с сообщением или контентом. спасибо :) – sobhan

+0

Мне было интересно, так ли эта тема для всех, или мы не рассматриваем возможность входа в наши проекты? 2 дня и без участия сообщества! – sobhan

ответ

0

Вы собираетесь собирать детали для аналитических материалов. Хорошо, если вы идете на плоские таблицы, а не на реляционные таблицы.

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

+0

Таблица журналов плоская, отношение между примерами таблиц продукта и компании было реляционным, что фактически не имеет отношения к обсуждению и рассматривается как пример. Если вы имеете в виду плоские базы данных, такие как варианты NoSQL, их можно обсуждать отдельно – sobhan

Смежные вопросы