Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Обновление id, не имеющих auto increment

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Как лучше сделать?
Vechnost
Отправлено: 08 Сентября, 2014 - 16:13:04
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Здравствуйте.

Есть таблица с записями, у каждого - свой id. Если у этих id стоит A_I, то возникает такая проблема: если удалить, скажем, 5 запись из 10, то 5 записи уже не будет никогда (при создании новой записи следующий id будет 11). Для порядка, имхо, неплохо бы не использовать A_I и написать скрипт, отслеживающий и обновляющий id.

Алгоритм я себе представляю примерно таким (псевдокод):

1. Добавление новой записи

В цикле

SELECT id FROM таблица

и заносим в $id_array;

$index = count($id_array);
$new_id = $id_array[$index]++;

INSERT INTO таблица (id) VALUES ($new_id);

Тут могут быть неточности с точки зрения php, не обращайте внимания - я код не продумывал, просто привожу для описания общей сути.

Новая запись имеет id на 1 больше, чем последний id в таблице. Всё хорошо. Но вот с удалением...

2. Удаление записи

В форме удаления выбираем запись, то есть id (это переменная $id);

DELETE FROM таблица WHERE id=$id;

Если удалена запись номер 5, то следом за 4 будет 6. Чтобы этого не было,

В цикле проделываем
$new_id = $id++;
UPDATE таблица SET id=$id WHERE id=$new_id;
До тех пор, пока в таблице есть ещё записи

Образовавшийся пропуск в ряде величин заполняется путём уменьшения всех id, стоящих после того, который мы удалили.

СУТЬ ВОПРОСА.

Если в таблице 10 или 20 записей - ещё ничего, но что если в блоге за несколько лет накопилась 1000 записей? Тогда, при попытке удалить 5-ю запись, запрос UPDATE будет посылаться 994 раза! Как сервер воспримет такую нагрузку?

В общем, коряво как-то выходит. Хочу спросить - есть ли какое-то более аккуратное решение?

P.S. Я слышал, что в sql-сервере предусмотрены какие-то процедуры, циклы... Может быть, не париться о php-шном "обновляторе", а сразу MySQL учить и в этом направлении курс держать?
 
 Top
difight
Отправлено: 08 Сентября, 2014 - 16:16:15
Post Id



Посетитель


Покинул форум
Сообщений всего: 355
Дата рег-ции: Нояб. 2011  


Помог: 3 раз(а)




Цитата:
Если в таблице 10 или 20 записей - ещё ничего, но что если в блоге за несколько лет накопилась 1000 записей? Тогда, при попытке удалить 5-ю запись, запрос UPDATE будет посылаться 994 раза! Как сервер воспримет такую нагрузку?

запрос UPDATE будет посылаться 994 раза!
С фигали ?Улыбка
 
My status
 Top
Мелкий Супермодератор
Отправлено: 08 Сентября, 2014 - 16:18:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Vechnost пишет:
то возникает такая проблема:

Проблема-то где?


-----
PostgreSQL DBA
 
 Top
Vechnost
Отправлено: 08 Сентября, 2014 - 16:35:26
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




А что, проблемы нету?!!

Ну, то есть да - то, что чём я говорю вначале, это скорее не проблема, а нюанс. Просто мне кажется, что id необходимо отслеживать без auto increment. Не логично как-то, когда удалишь с сайта старые записи, а потом отсчёт начинается с какой-нибудь там 369-й записи... Ведь именно так будет с ai.

Мой алгоритм предполагает уменьшение всех id, стоящих после удалённого. Если записей действительно много - мне кажется, нагрузка будет большая.

Ну подумайте: берётся id, который мы удалили. Следом за ним - id большего размера, и мы его уменьшаем. Следом следом - ещё id, и его уменьшаем... Чтобы выстроить ровную цепочку: 1,2,3,4,5,6,7,8 вместо разорванной 1,2,3,4,6,7,8. Ели записей 8 или 10, то цикл будет посылать 8 или 10 запросов на переписывание следующих id. Если записей (этих самых id) ОЧЕНЬ много (сайт разросся на годы), то и запросов будет столько же, сколько стоит записей после удалённой нами. И если их 1000, то, удалив 995-ю запись, мы получим всего 5 запросов, НО если мы удалим 5-ю или 1-ю запись - посчитайте сами, сколько будет запросов.

А если стану удалять запись в тот момент, когда на сайте несколько сотен (или тысяч) посетителей??? (ну, хороший сайт, раскрученный)

Неужели для современных серверов это настолько незначительно?

Или вы хотите сказать, что вообще не стоит заниматься этим? Либо с AI, либо никак?

(Отредактировано автором: 08 Сентября, 2014 - 16:50:17)

 
 Top
Мелкий Супермодератор
Отправлено: 08 Сентября, 2014 - 16:54:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Vechnost пишет:
А что, проблемы нету?!!

Нету, конечно.
AI уникален.

Видите вот этот форум? Вы можете послать кому-нибудь на эту страницу ссылку? А если я сейчас удалю, например, тему №15140? Куда человек по вашей ссылке попадёт?


-----
PostgreSQL DBA
 
 Top
Vechnost
Отправлено: 08 Сентября, 2014 - 20:40:47
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Конечно, AI уникален - кто ж спорит. Вероятно, этим вы хотите сказать, что отказываться от AI не имеет смысла, не так ли?

То есть, идея самому контролировать заполнение id - изначально тухлая затея?
 
 Top
Мелкий Супермодератор
Отправлено: 08 Сентября, 2014 - 21:12:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Vechnost пишет:
То есть, идея самому контролировать заполнение id - изначально тухлая затея?

Да.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB