логин: 
Другие записи за это число:
2009/12/21_loadlj - поправил глюки в loadlj
2009/12/21_sho - шо любопытно
<< предыдущая заметкаследующая заметка >>
21 декабря 2009
размышления о базе

Итак, система посетительского учета будет принципиально иной, нежели была в дневнике.
Принципы следующие:

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

-- При каждом заходе делается новая запись в отдельной базе заходов. Это позволит вести точный учет, сколько именно ЧЕЛОВЕК читают дневник. А не крутят счетчик, забегая повторно.

-- При каждом посетительском действии (например, при голосовании за коммент) делается запись в базу голосов. Повторные голосования (накрутки) станут затруднены. То есть, для накрутки надо каждый раз менять браузер. А то и IP — можно, например, запретить регистрацию больше 10 человек с одного IP.

Вопросы по оптимизации базы:

1) Я заебываюсь работать с полем Datetime. Не проще ли будет (и не быстрее ли для MySQL) хранить дату в int 11?

2) Допустим, база посещений устроена так:

A = [int 11] номер посетителя
Б = [int 11] номер заметки
В = [int 11] дата посещения

Наиболее частая выборка из базы посещений будет:

-- Посещал ли человек 111 заметку 222 (если да — не вносить)? "COUNT(*) WHERE A=111 AND B=222"
-- Сколько человек открывали заметку 222? "COUNT(*) WHERE B=222"

Вопрос: какие мне надо индексы построить для такой базы? Я правильно понимаю, что нужен двойной индекс (A,B) и отдельно индекс B?

Еще вопрос: имеет ли смысл при каждом заходе нового посетителя (по моим предположениям 30% посещений заметки — повторные заходы) дублировать результат "COUNT(*) WHERE B=222" в поле счетчика заметки? Или по скорости никакого выигрыша не будет, и лучше для каждой заметки счетчик определять динамически, выполняя всякий раз "COUNT(*) WHERE B=222"?

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
Страницы, которые привлекли мое внимание за последние дни, рекомендую:
2017-11-22 В июне 1982
архив ссылок
Оставить комментарий