Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ваши id для новых элементов.
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 14:03)   письмо автору
 
 

Вопрос странный, своеобразный, простой, отчасти глупый, но меня очень любопытствующий.

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

Вот мне интересно, по какому алгоритму вы ведёте их счёт? Т.е. как определяете, какой новый номер стоит присвоить, почему именно такой.

Мне не нужно ваших кодов, пусть это останется вашим секретом, но вот в общих словах было бы интересно послушать.

  Ответить  
 
 автор: cheops   (16.02.2011 в 14:06)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:03)
 

Собственно базы данных предоставляют механизм, который позволяет присваивать сообщениям уникальные значения - вот этим механизмом почти все и пользуются. Первому по времени сообщению присваивается 1, второму на единицу больше, т.е. 2 и т.д.

  Ответить  
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 14:09)   письмо автору
 
   для: cheops   (16.02.2011 в 14:06)
 

Хорошо, а если одно из сообщений удалить?

  Ответить  
 
 автор: cheops   (16.02.2011 в 14:10)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:09)
 

Будет пропуск.

  Ответить  
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 14:10)   письмо автору
 
   для: cheops   (16.02.2011 в 14:10)
 

А как быть, если сообщения добавлены в абсолютно одно и тоже время (например, 1297854600)?

  Ответить  
 
 автор: cheops   (16.02.2011 в 14:13)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:10)
 

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

  Ответить  
 
 автор: Trianon   (16.02.2011 в 14:13)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:10)
 

Одновременно пришедшие запросы так или иначе встанут в очередь на исполнение, и исполнены будут последовательно.
Номера AUTO_INCREMENT выдаются не по времени исполенения запроса, а в порядке создания записи. Так что одинаковых номеров не будет всяко.

  Ответить  
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 14:33)   письмо автору
 
   для: Trianon   (16.02.2011 в 14:13)
 

А я почему-то никогда не пользовался AUTO_INCREMENT. Может не привык. На базы перешёл с файлов, так делаю по старинке: содержу файл, в котором прописывается номер и каждый раз его увеличиваю.

  Ответить  
 
 автор: Владимир55   (16.02.2011 в 14:36)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:33)
 

В одном из проектов я использовал время поступления в микросекундах.

  Ответить  
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 14:38)   письмо автору
 
   для: Владимир55   (16.02.2011 в 14:36)
 

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

  Ответить  
 
 автор: cheops   (16.02.2011 в 14:40)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:38)
 

Если посещаемость интенсивная, не исключает.

  Ответить  
 
 автор: Владимир55   (16.02.2011 в 15:42)   письмо автору
 
   для: cheops   (16.02.2011 в 14:40)
 

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

Разве не так?

  Ответить  
 
 автор: cheops   (16.02.2011 в 16:04)   письмо автору
 
   для: Владимир55   (16.02.2011 в 15:42)
 

Файл обычно дольше одной микросекунды обрабатывается - неприятности вполне могут быть, лучше организовывать очередь, пусть даже простейшую файловую, т.е. писать все в отдельные файлы, которые потом одним процессом упаковывать в единый файл. В этом случае гарантировано ничего теряться и биться не будет.

  Ответить  
 
 автор: Trianon   (16.02.2011 в 16:39)   письмо автору
 
   для: Владимир55   (16.02.2011 в 15:42)
 

>Разрешение у сервера более одной микросекунды, так что, как мне кажется, совпадение технически невозможно.
>Разве не так?

С одной стороны, даже если совпадение невозможно сейчас, нет гарантии, что это не случится в будущем.
С другой, для хранения точного времени в достаточно длинном интервале потребуется поле большей разрядности.
Поиск по такому полю потребует более толстого ингдекса и проходить будет медленее.

Кроме того, использование секвенции позволяет определять факт удаления строк, выявлять смежные записи, хоть это и не прямое её назначение.
И главное, от очереди запросов все равно никуда не уйти.

Вот и получается, что выгоды от применения времени в качестве ключа - никакой.
А потери есть.

С другой стороны, применение механизма AUTO_INCREMENT в качестве суррогатного первичного ключа никто не навязывает. Если Вы хотите применять метку времени (или еще что-то) - Вы вполне можете так поступить.
Вот только будет ли профит...

  Ответить  
 
 автор: Владимир55   (16.02.2011 в 16:49)   письмо автору
 
   для: Trianon   (16.02.2011 в 16:39)
 

Совершенно с Вами согласен.

  Ответить  
 
 автор: cheops   (16.02.2011 в 14:39)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:33)
 

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

PS Собственно пользоваться механизмом AUTO_INCREMENT до неприличия просто, нужно просто назначить этот атрибут столбцу и передавать в каждой новой записи значение NULL - уникальные значения будет присваиваться автоматически. Если это значение нужно сразу после добавления запроса, его можно получить при помощи функции mysql_insert_id().

  Ответить  
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 14:37)   письмо автору
 
   для: cheops   (16.02.2011 в 14:06)
 

А можно тогда ещё вопрос такой, этот AUTO_INCREMENT начинает нумерацию с нуля или единицы? И он будет увеличивать каждый раз число, даже если последняя запись была удалена?

  Ответить  
 
 автор: cheops   (16.02.2011 в 14:40)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:37)
 

По умолчанию с единицы, но вы можете назначить в качестве начала - любое произвольное число (либо в операторе CREATE TABLE, либо потом при помощи ALTER TABLE).

  Ответить  
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 14:41)   письмо автору
 
   для: cheops   (16.02.2011 в 14:40)
 

А при записи новой INSERT INTO что нужно указывать для этого поля?

  Ответить  
 
 автор: cheops   (16.02.2011 в 14:41)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:41)
 

Просто NULL

  Ответить  
 
 автор: Trianon   (16.02.2011 в 16:26)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:37)
 

> И он будет увеличивать каждый раз число, даже если последняя запись была удалена?

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

  Ответить  
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 19:56)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 14:03)
 

Всех благодарствую.

Я привык к файлам, и потому использовал именно их. Создал функцию, для простого назначения нового id, но новый вариант действительно упрощает жизнь. Что ж, перейду тогда на него. Я немного его потестировал и мне понравился результат.

Спасибо.

  Ответить  
 
 автор: neadekvat   (16.02.2011 в 20:23)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 19:56)
 

То ли еще будет.
Переход с файлов на базу данных открывает колоссальные возможности.

  Ответить  
 
 автор: cheops   (16.02.2011 в 20:26)   письмо автору
 
   для: neadekvat   (16.02.2011 в 20:23)
 

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

  Ответить  
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 20:29)   письмо автору
 
   для: cheops   (16.02.2011 в 20:26)
 

Верно, уже несколько лет как )

Появился правда ещё один вопрос, я им сам задался щас, когда решил сменить некоторые запросы к базе данных с учётом нововведений и сразу же столкнулся с такой проблемой: раньше-то я заранее знал, какой id будет записан, потому как сначала генерировал его, а уж потом использовал. Сейчас же получится наоборот. Я сначала его запишу, а потом мне нужно узнать какой он. Я так понял мне поможет mysql_insert_id, но вот загвоздка — точно ли mysql_insert_id возвратит мне последний созданный id или могут быть проблемы при большом количестве запросов одновременно?

  Ответить  
 
 автор: cheops   (16.02.2011 в 20:33)   письмо автору
 
   для: Vyacheslav Tsv.   (16.02.2011 в 20:29)
 

>точно ли mysql_insert_id возвратит мне последний созданный id или могут быть проблемы при
>большом количестве запросов одновременно?
Точно. Дело в том, что mysql_insert_id() возвращает только тот номер, который был вставлен в рамках текущей сессии, т.е. между INSERT-запросом и вызовом mysql_insert_id() может успеть вставиться еще пяток запросов, но вам будет возвращен номер того, который вставлялся именно вашим запросом.

  Ответить  
 
 автор: Vyacheslav Tsv.   (16.02.2011 в 20:36)   письмо автору
 
   для: cheops   (16.02.2011 в 20:33)
 

Ваши слова меня успокоили. Благодарю, Игopь Вячecлaвoвич.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования