Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / БД действий пользователей / 7 сообщений из 7, страница 1 из 1
05.11.2016, 11:32
    #39341743
no_username
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
БД действий пользователей
Привет!

Я сделал схему БД для логирования действий пользователей, где пользователи могут искать:
По всем типам эвентов, фильтруя по дате или имени пользователя

По одному типу эвенту, с теми же фильтрами по дате и пользователю + по параметрам этого эвента

Вот схема



Вот так выглядит поиск по всем эвентам
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT extract(epoch FROM log_time) * 1000,
       u.username,
       CASE
           WHEN l.event_type IN (0, 2) THEN e.template
           WHEN l.event_type = 1 THEN format(e.template, ecs.field)
           WHEN l.event_type = 3 THEN format(e.template, ess.field)
           WHEN l.event_type = 4 THEN format(e.template, ect.ip, ect.port)
       END
FROM logs l
JOIN users u ON u.id = l.user_id
JOIN event_def e ON e.id = l.event_type
LEFT JOIN event_client_search ecs ON ecs.log_id = l.id
LEFT JOIN event_switch_search ess ON ess.log_id = l.id
LEFT JOIN event_cable_test ect ON ect.log_id = l.id



А вот так по эвенту одного типа
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT extract(epoch FROM log_time) * 1000,
       u.username,
       format(e.template, ect.ip, ect.port)
FROM logs l
JOIN users u ON u.id = l.user_id
JOIN event_def e ON e.id = l.event_type
JOIN event_cable_test ect ON ect.log_id = l.id



Содержимое таблицы event_def :
Код: sql
1.
2.
3.
4.
5.
6.
7.
     id |                template
    ----+----------------------------------------
      0 | Logged in
      2 | Logged out
      1 | Searched in clients %s
      3 | Searched in switches %s
      4 | Cable test switch %s port %s



Но мне не нравится, что когда у меня будет около 100 разных эвентов (сейчас у меня планируется около 50, но я их не реализовал пока),
планировщик будет работать чуть больше одной секунды
Код: sql
1.
Planning time: 1027.201 ms Execution time: 6.827 ms (415 rows)



Думал может быть объединить эвенты по типам, вот так


Это хоть и уменьшит количество эвентов\таблиц вдвое, но все равно меня не покидает чувство, что я делаю что-то не так, может кто-нибудь подскажет?

Заранее спасибо!
...
Рейтинг: 0 / 0
05.11.2016, 13:11
    #39341773
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
БД действий пользователей
no_username, а есть ли смысл писать своё решение, если можно взять готовое?
...
Рейтинг: 0 / 0
05.11.2016, 13:31
    #39341781
no_username
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
БД действий пользователей
skyANAno_username, а есть ли смысл писать своё решение, если можно взять готовое?

Как я понимаю, речь об эластике? Сейчас у меня все хранится в нем и оно работает отвратительно. Или что-то другое?
...
Рейтинг: 0 / 0
05.11.2016, 13:41
    #39341786
no_username
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
БД действий пользователей
Не нашел как отредактировать сообщение, знакомые предложил хранить параметры эвентов в jsonb (база данных постгрес, он хорошо с ними умеет работать)

logs.params будет выглядеть примерно так
Код: javascript
1.
2.
3.
4.
{
  ip: "x.x.x.x",
  port: 10
}


event_def.template для этого эвента
Код: sql
1.
cable test ip {ip} port {port}



И в коде уже все это разруливать
...
Рейтинг: 0 / 0
05.11.2016, 18:14
    #39341875
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
БД действий пользователей
правильно ли я понимаю, что таблиц event_действия_пользователя будет столько сколько типов эвентов?
И это количество имеет свойство расти.
Тогда твоя проблема будет - что мне надо переделать когда добавится новый тип событий.

Решений несколько: пан LSV будет уговаривать на EAV (таблицы event_attribute, event_attribute_value)
плюсы:при добавлении нового типа событий не придется применять DDL скрипт, а только DML.
минусы:самая медленная схема

Про JSON или XML я вижу вы сами догадались
Плюсы: просто
минусы: нарушает первую нормальную форму

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

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

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

Использование первичных ключей.
Заведите себе другое поле (логический код вместо физического id) и используйте его для форматирования. Оставьте первичные ключи только для реализации ссылочной целостности.
...
Рейтинг: 0 / 0
07.11.2016, 09:14
    #39342352
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
БД действий пользователей
no_usernameskyANAno_username, а есть ли смысл писать своё решение, если можно взять готовое?

Как я понимаю, речь об эластике? Сейчас у меня все хранится в нем и оно работает отвратительно. Или что-то другое?
Эластик, или MongoDB, или вон Вам даже Postgres насоветовали.
Современные логгеры куда только не пишут. А всякие кибаны с графанами откуда только не читают.
...
Рейтинг: 0 / 0
07.11.2016, 09:21
    #39342353
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
БД действий пользователей
К примеру Serilog следующие хранилища поддерживает: Provided Sinks .
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / БД действий пользователей / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]