В моей системе Users
можно добавлять / редактировать / просматривать Customers
.Я хотел бы добавить функцию, позволяющую пользователю видеть «Недавно просмотренные клиенты».Это покажет им последних 20 клиентов, которых они видели (включая добавление / редактирование).
Пользователи будут просматривать клиентов очень часто, когда они переходят между различными веб-страницами, и это должно быть очень эффективным.Я хотел бы сохранить это между сеансами, поэтому он должен быть сохранен в базе данных.Сейчас около 16 000 пользователей и 600 000 клиентов.
Вот то, что я считаю дизайном.
Создайте новую таблицу:
- Столбцы
(UserId, CustomerId, DateViewed)
- Первичный ключ -
(UserId, CustomerId)
- Индекс организован
- Отдельные индексы для внешних ключей
UserId
и CustomerId
DateViewed
столбецсуществует только для упорядочения записей
Создайте процедуру PL / SQL, которая с параметрами UserId
и CustomerId
отвечает за сохранение того, что пользователь просмотрел клиента.В процедуре PL / SQL я бы:
- Использовать
MERGE
, чтобы вставить или обновить строку с заданными UserId
и CustomerId
настройками DateViewed
до SYSDATE
- Если в результате слияния была вставлена строка, используйте аналитический запрос для удаления любых строк с
row_number()
> 20
Страница «Недавно просмотренные клиенты» становится базовым соединением междуновая таблица и таблица клиентов, упорядоченные DateViewed и ограниченные 20 записями на всякий случай.Не нужно включать DateViewed в какой-либо индекс, так как он сортируется только в 20 строк.
Скажем, раз в месяц удаляйте все записи с DateViewed старше года.Это было бы полное сканирование.Cascade удаляет из Customer и User в новую таблицу.
У кого-нибудь есть предложения по улучшению или другие идеи, которые стоит профилировать?
(Другая идея, которую я имел, состояла в том, чтобы денормализовать в таблицу с20 столбцов для различных идентификаторов CustomerId и случайных значений по сравнению с CustomerId1 -> CustomerId2 -> CustomerId3. Это потребует различных обновлений в зависимости от того, где CustomerId уже появился в списке.)