Можно ли сделать "интеллектуальный" AUTO_INCREMENT?

Статус
В этой теме нельзя размещать новые ответы.

untied

Сдвинутый новичок
Можно ли сделать "интеллектуальный" AUTO_INCREMENT?

Обычный AUTO_INCREMENT тупо увеличивает на единицу свой счетчик.
Мне же хотелось бы использовать освобождающиеся идентификаторы, которые появляются по мере удаления старых записей.
(для чего это нужно могу объяснить)

До сих пор делал это так: считывал все идентификаторы в массив, потом находил свободный идентификатор циклом:

PHP:
for ($new_id = 1; in_array($new_id,$a_idlist); $new_id++);
Когда записей немного этот вариант вполне приемлем.
Но вот когда записей много, есть ли способ подбирать идентификаторы на место освободившихся средствами MySQL?
 

Zetruger

ivan.chistyakov.name
BIGINT
Диапазон со знаком от -9223372036854775808 до 9223372036854775807
Диапазон без знака от 0 до 18446744073709551615

Тебе 18446744073709551615 идентификаторов мало что ли?

Блин я даже не могу прочитать это число!

-~{}~ 23.07.07 16:10:

Вообще на практике не встречал таблицы даже с парой милиардов записей
 

asm

Пофигист
untied
А теперь подумай про криво удаленные записи связанные со старыми id
 

untied

Сдвинутый новичок
Объясняю.
Для обменного каталога ссылок.

Там принято:
1. при обмене указывать постоянный адрес страницы, где расположена ссылка;
2. некоторые ссылки удалять (например, когда обмен не состоялся, или обратную ссылку удалили).

Дык вот. Если при выводе страниц каталога ссылки сортировать, к примеру, по дате, то возникает неразбериха. Допустим, ранее добавленные ссылки удалили по каким-то причинам, при этом нижестоящие подвинулись вверх, поменяв страницу (на странице выводится по десять ссылок). Хозяева этих ссылок начинают шуметь, что на указанной странице с обраткой ссылка пропала. Ну и т.д.

Вот я и придумал сортировать по идентификатору. При этом если запись с определенным идентификатором отсутствует (к примеру: 5-6-7-9, а 8-пропущен), то на его место выводится баннер "Здесь могла бы быть ваша реклама".
Таким образом, новые ссылки вставляются на место баннеров и в конец списка (т.е. на свободные идентификаторы), и чехарды со сменой страниц не происходит.
 

MajestiC

Пых
Я бы завел отдельное поле для сортировки, нечего вешать на id лишние функции =)
 

Zetruger

ivan.chistyakov.name
если ты хочешь чтобы определенныя ссылка всегда была на определенной страницы уж не легче добавить в таблицу колонку типа page_id
 

untied

Сдвинутый новичок
Автор оригинала: MajestiC
Я бы завел отдельное поле для сортировки, нечего вешать на id лишние функции =)
Ну дык возникает ровно та же самая задача с выбором нового номера для сортировки, с неудачным использованием все того же in_array(). ;)
Только при этом получаем лишнее поле для каждой записи.

Автор оригинала: Zetruger
если ты хочешь чтобы определенныя ссылка всегда была на определенной страницы уж не легче добавить в таблицу колонку типа page_id
При этом возникнет не менее кислая задача с поиском нужной страницы для новой добавляемой ссылки (т.е. поиск страницы с числом ссылок менее десяти). ;)
 

asm

Пофигист
Автор оригинала: untied
Дык вот. Если при выводе страниц каталога ссылки сортировать, к примеру, по дате, то возникает неразбериха. Допустим, ранее добавленные ссылки удалили по каким-то причинам, при этом нижестоящие подвинулись вверх, поменяв страницу (на странице выводится по десять ссылок). Хозяева этих ссылок начинают шуметь, что на указанной странице с обраткой ссылка пропала. Ну и т.д.
Отвечай что у их ссылки поднялся рейтинг и они поднялись на пару страниц :) Все будут довольны
 

untied

Сдвинутый новичок
Автор оригинала: asm
Отвечай что у их ссылки поднялся рейтинг и они поднялись на пару страниц :) Все будут довольны
Кроме меня.
Представь 30 страниц со ссылками, при этом несколько ссылок удалились с первой страницы. При таком подходе нужно будет объясняться с сотней-другой рассерженных веб-мастеров.
А если учесть, что ведомых сайтов у меня не один и не два, то такое решение будет самым неудачным. ;)
 

Zetruger

ivan.chistyakov.name
При этом возникнет не менее кислая задача с поиском нужной страницы для новой добавляемой ссылки (т.е. поиск страницы с числом ссылок менее десяти).
Ну это делается ну просто элементарно одним запросом
SELECT COUNT(id) FROM links GROUP BY page_id
получаем количество ссылок на каждой из страниц
соответственно если добавить ORDER то можно все страницы с кол. ссылок меньше 10 поместить в начало

-~{}~ 23.07.07 16:46:

SELECT COUNT(id) AS links_per_page FROM links GROUP BY page_id
HAVING links_per_page<10

выбрать только страницы скол. ссылок меньше 10
 

untied

Сдвинутый новичок
Автор оригинала: Zetruger
Ну это делается ну просто элементарно одним запросом
SELECT COUNT(id) FROM links GROUP BY page_id
получаем количество ссылок на каждой из страниц
соответственно если добавить ORDER то можно все страницы с кол. ссылок меньше 10 поместить в начало

-~{}~ 23.07.07 16:46:

SELECT COUNT(id) AS links_per_page FROM links GROUP BY page_id
HAVING links_per_page<10

выбрать только страницы скол. ссылок меньше 10
Oh! Great!
Спасибо за идею!!! :D
 

MajestiC

Пых
Для минимального свободного:
SELECT MIN(field+1) FROM tbl WHERE NOT ( (field + 1) IN (SELECT field FROM tbl) )

Для максимального свободного:
SELECT MAX(field-1) FROM tbl WHERE NOT ( (field - 1) IN (SELECT field FROM tbl) )
 

kruglov

Новичок
1. при обмене указывать постоянный адрес страницы, где расположена ссылка;
Давайте не прямой адрес на нужную n-ю страницу, а такой, который редиректнет на нужную в тот момент страницу.
 

untied

Сдвинутый новичок
Автор оригинала: kruglov
Давайте не прямой адрес на нужную n-ю страницу, а такой, который редиректнет на нужную в тот момент страницу.
Это нипочем не решение.
Обратки обычно проверяет робот, который совсем не обязательно проглотит редирект.
 

Splurov

Новичок
Автор оригинала: untied
Это нипочем не решение.
Обратки обычно проверяет робот, который совсем не обязательно проглотит редирект.
А как будет выглядеть страница, если на ней будет удалено, например, 19 ссылок из 20? 19 рекламных блоков и одна ссылка, которую не будет видно? Вам это не видется абсурдным?
 

untied

Сдвинутый новичок
Автор оригинала: Splurov
А как будет выглядеть страница, если на ней будет удалено, например, 19 ссылок из 20? 19 рекламных блоков и одна ссылка, которую не будет видно? Вам это не видется абсурдным?
Вообще-то на странице 10 ссылок. ;)
Ну допустим 9 будет удалено, останется одна ссылка и девять баннеров.
Во-первых, новые ссылки добавляются достаточно часто, так что в подобном состоянии страница будет недолго.
Во-вторых, ни для кого не секрет, что подобные страницы делаются не для живых посетителей сайта, а для роботов -- проверяющих обратки, и поисковых.

Для меня главное, чтобы все работало с максимальной устойчивостью к возможным сбоям. Пусть даже 10 баннеров на странице выглядят абсурдно, но зато все роботы довольны. :D
 

Splurov

Новичок
untied
Если страницы делаются только для роботов, то почему нельзя делать уникальную ссылку для каждого урла (даже без редиректа)?
 

untied

Сдвинутый новичок
Автор оригинала: Splurov
untied
Если страницы делаются только для роботов, то почему нельзя делать уникальную ссылку для каждого урла (даже без редиректа)?
Да, есть такой вариант, при регистрации в каталоге веб-мастеру дают две ссылки: динамическую, актуальную в текущий момент, и "вечную" -- для проверки роботом.

Но, во-первых, веб-мастера разные бывают. Наверняка найдется какой-нибудь студент, который роботу пропишет на проверку динамическую ссылку. И через какое-то время робот станет ругаться. Разбираться с каждым таким случаем нет никакого желания.
Во-вторых, для поисковиков такой вариант тоже не очень хорош. За каждый заход на сайт робот-поисковик сканирует не все страницы сайта, а лишь выборочно. И если ссылка переместится на другую страницу, то во время очередного захода робот может ее не найти (в терминах SEO -- ссылка "отвалится").

Таким образом, со всех сторон лучше и надежнее иметь один линк на страницу с нужной ссылкой.

Однако, тема постепенно сваливается из баз данных в офтопик, так что предлагаю закруглиться. :cool:
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху