0
<< предыдущая заметкаследующая заметка >>
28 декабря 2010
вопрос по MyQSL

Ситуация: каждый браузер посетителя получает свой номер в куках, который отныне хранит вечно (в реальности как получится). Это номер нужен мне впоследствии для статистики, учета комментариев и т.п. (например, чтобы голосовали только по одному разу). Это данность, которая лежит в основе движка, и обсуждать это не надо, вопрос в другом.

Практика показала, что пользуются учетным номером в полной мере (регистрируются, прописывают логин-пароль, заполняют карточку) не более 1% посетителей. Глупо хранить пустую на 99% mysql-таблицу с кучей полей. Глупо искать в базе данные при каждом обращении, хотя в 99% случаев данных нет.

SELECT COUNT(*) FROM `unic`
651144

SELECT COUNT(*) FROM `unic` WHERE (`login`!='' AND `password`!='') OR `openid`!=''
4140

SELECT COUNT(*) FROM `unic` WHERE (`login`!='' AND `password`!='') OR `openid`!='' OR `realname`!='' OR `lju`!='' OR `mail`!='' OR `site`!='' OR `birth`!='0000-00-00'
42769

Но PHP не позволяет где-то хранить или генерировать новый номер+1 с гарантией отсутствия дублей. Как быть? Варианта я вижу два:

1. Две таблицы. В одной — только номер, для которого выполянется auto_increment, после чего номер можно выдать в куку посетителю, а запись смело удалять:

CREATE TABLE `uni` (
`id` int(10) unsigned NOT NULL auto_increment,
)

В другой — вся регистрационная информация, если посетитель ее ввел:

CREATE TABLE `reg` (
`id` int(10) unsigned NOT NULL auto_increment,
`uni` int(10) unsigned NOT NULL,
`login` .....
`password` .....
`realname` ....
....
)

2. Одна таблица `reg` (первую таблицу `uni` не делать). Вместо этого выдавать посетителю длинный номер BIGINT вида 2010122611530000001, где первые цифры 201012261153 — число и время обращения за номером, а 0000001 — случайное число.
Это не вполне чистое решение, потому что теоретически при обращении в одну и ту же секунду, скрипт может выдать два одинаковых номера. Кроме того, тогда придется всюду в учетных записях указывать номер посетителя bigint вместо int, не слишком ли это большая трата ресурсов?

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок
Оставить комментарий


Include not found: `/home/www/lleo.me/blog/template/_reklamnaya_lirica.htm`