powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / "Свернуть" данные?
8 сообщений из 8, страница 1 из 1
"Свернуть" данные?
    #37201913
Un4given
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если быть точнее, то конечно слово "свёрка" тут не подходит, надо что-то другое. В общем суть в следущем. Есть пользователи (U_ID), есть статьи и реклама (A_ID). Крайне желательно показывать юзеру при посещении очередной страницы в блоке рекламы выжимку из статьи или баннер, который ему ещё не показывался. Приоритетом показа на данном этапе не заморачиваемся. То есть условие - пока ВСЕ блоки не показали, два раза одно и тоже пользователь видеть не должен. До сих пор для отслеживания была простая табличка tcr_User_Adv из U_ID и A_ID, в которую писали, что уже просмотрено, а при запросе рекламного блока отбирали его по условию WHERE A_ID NOT IN (SELECT A_ID FROM tcr_User_Adv). Всё бы замечательно, но время шло, пользователей становилось вс больше, рекламы тоже, на сегодня в перекрёстной таблице имеем порядка 75 миллионов записей. Время выборки сами понимаете какое...
Вот и пришла мне в голову мысль, для пользователя хранить данные в виде

Код: plaintext
1.
2.
3.
4.
5.
U_ID   A_ID1  A_ID2
371    1        5
371    7
371    10      12
371    17      48
то есть диапазоны показанных значений, либо даже

Код: plaintext
1.
2.
U_ID   A_ID
371    (1-5),7,(10-12),(17-48)
но тогда обрабатывать программно, потому как запросом здесь не справиться, первый вариант в этом плане лучше.
Никто не заморачивался с таким?
...
Рейтинг: 0 / 0
"Свернуть" данные?
    #37201953
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Un4given,

Как вариант с битовой маской:
Код: plaintext
1.
2.
U_ID1 000000000000000000000000000000000 - ни чего не смотрел
U_ID1 000000000000000000000000000000001 - посматрел первую
U_ID1 000000000000000000000000000000011 - посматрел первую и вторую ну и тд...
...
Рейтинг: 0 / 0
"Свернуть" данные?
    #37201974
Un4given
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_A,

да, такой вариант тоже рассматривали, место экономит сильно, но поиск опять же только программно?
...
Рейтинг: 0 / 0
"Свернуть" данные?
    #37202041
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Un4given,

Если считаем, что ID рекламы соответствует позиция в маске. Ищем первый выключеный бит. По его позиции определяем ID, показываем его юзеру.

Если все реализовать через AND OR XOR все будет работать очень быстро.
Плюс на такой маске можно будет реализовать вариант с анализом частоты показов.
...
Рейтинг: 0 / 0
"Свернуть" данные?
    #37202637
Un4given
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Единственно, тип SET не подходит по длине, тогда можно было бы и запросы организовать, мне получается нужно поле байт в 600 :)
...
Рейтинг: 0 / 0
"Свернуть" данные?
    #37202851
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Un4given WHERE A_ID NOT IN (SELECT A_ID FROM tcr_User_Adv) Не нравится мне эта конструкция. exists гораздо надежнее.
Код: plaintext
where not exitst (select * from tcr_User_Adv tcr where tcr.A_ID=a.A_ID and tcr.U_ID=a.U_ID)
Умный сервер может в это преобразовать, но я бы на это не надеялся. А в плане точно только один лишний поиск по индексу для
конечной выборки? То есть грубо говоря сколько записей нам надо посмотреть в таблице tcr_User_Adv на вызов? Например на каждый вызов (посещение) есть сто (тысяча) комбинаций баннеро-страниц. Для каждой комбинации надо просмотреть есть ли она уже в показе итого имеем X лишних сканов на которые уходит Y миллисекунд.
Итак X и Y признаны неприемлимыми.
Если допустить что Приоритетом показа на данном этапе не заморачиваемся и что данные только добавляются (то есть внутренний id всегда растет) то как временная мера можно запоминать последний показанный id и заменить условие на
Код: plaintext
where A_ID>last_shown_id_for_user
не обращаясь к дополнительной табличке.
...
Рейтинг: 0 / 0
"Свернуть" данные?
    #37202909
Un4given
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ID к сожалению вразнобой и, более того, приоритеты меняются. Но сейчас пока не до них.
Если копнуть глубже, то даже не столько выборка тормозит, сколько добавление записи. На выборку уходит примерно 0,3 - 0,4 секунды, на добавление две с половиной.
...
Рейтинг: 0 / 0
"Свернуть" данные?
    #37202965
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Un4given на добавление две с половиной.Именно. А все ваши свертки они только увеличивают время вставки (ибо больше интеллекта требуют). Далее вопрос к вашему ДБА, а на что уходит время вставки (поиск места в блоке, поиск свободного блока, и т.д.) и расшивать эти узкие места. Возможно (тут уже тонкий лед предположений) ее имеет смысл секционировать (например разбить на 100 подтаблиц в зависимости от двух последних цифр id пользователя) если велика конкуренция. Но это лучше на профильный подфорум.
Далее как то надо эту табличку чистить. Реклама становится неактивной - всю историю посещений долой. Пользователь просмотрел все - всю историю посещений долой.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / "Свернуть" данные?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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