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 :: Зависимый AUTO_INCREMENT

 PHP.SU

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


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

> Без описания
Toxa
Отправлено: 27 Декабря, 2012 - 22:31:28
Post Id



Посетитель


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


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

[+]


Вы обращали внимание, как вконтакте организован доступ к контенту?
Примерно так vk.com/content{user_id}_{content_id}
Сообщение №574 от пользователя 23 будет иметь вид vk.com/message23_574
А фото 432 от пользователя 33 - vk.com/photo33_432

Это не точные ссылки, здесь показан принцип!

Я хочу сделать подобную структуру в MySQL и рассматриваю плюсы и минусы.
При этом структура таблицы `messages` будет иметь приблизительно такую структуру:

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `messages` (
  2.   `message_id` INT NOT NULL DEFAULT NULL,
  3.   `user_id` INT NOT NULL DEFAULT NULL,
  4.   `text` MEDIUMTEXT NOT NULL DEFAULT 'NULL',
  5.   UNIQUE KEY (`message_id`, `user_id`)
  6. );

Из плюсов мы видим улучшенную индексацию (сразу по 2м полям), выборка будет явно быстрее.
А что касается минусов - то тут усложняется процесс выборки, вместо одного поля приходится указывать два.

А теперь, собственно вопрос - как сделать, чтобы при вставке user_id у меня автоматически инкрементом вставлялся message_id??

И вообще, что думаете о такой структуре?
(Добавление)
P.S. понятно, что в итоге вместо user_id надо использовать user_from и user_to, но я не стал усложнять, это всего лишь пример


-----
Удобный сервис для хранения файлов
 
 Top
Мелкий Супермодератор
Отправлено: 28 Декабря, 2012 - 08:38:00
Post Id



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


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


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




Toxa пишет:
выборка будет явно быстрее.

Длина ключа дважды по 4 байта или один на 8 (bigint, чтобы получить то же максимальное число сообщений)?
Если рассматривать вплоть до спичек - один автоинкремент быстрее, т.к. только 1 бинарный поиск.

Toxa пишет:
А теперь, собственно вопрос - как сделать, чтобы при вставке user_id у меня автоматически инкрементом вставлялся message_id??

Объявить message_id автоинкрементом. Всё.
Работает только на myisam, потому вариант весьма неважный.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 28 Декабря, 2012 - 10:10:38
Post Id


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


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


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





насколько помню из интервью с П.Дуровым, они вообще не реляционной БД пользуются
 
 Top
Zuldek
Отправлено: 28 Декабря, 2012 - 10:38:33
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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





Вся база хранится на в виде постов на странице Дурова в ВК в скрытых полях типа hidden, выводимых из файла base.txt. Таким образом достигается коварное многоуровневое и дублированное кеширование и раздача данных всей бд ВК средствами JS из кук и localstorов браузеров всех посетителей страницы Дурова

(Отредактировано автором: 28 Декабря, 2012 - 10:41:48)

 
 Top
Toxa
Отправлено: 28 Декабря, 2012 - 12:05:24
Post Id



Посетитель


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


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

[+]


Zuldek, спасибо, улыбнуло.
Мелкий, я имел ввиду, что таблица будет вышлядеть примерно так:

CODE (SQL):
скопировать код в буфер обмена
  1. +---------+------------+----------+
  2. | user_id | message_id | text     |
  3. +---------+------------+----------+
  4. |       1 |          1 | message1 |
  5. |       1 |          2 | message2 |
  6. |       2 |          1 | message3 |
  7. |       2 |          2 | message4 |
  8. +---------+------------+----------+

в этом случае не будет диких значений в ключах при сколь угодно большом количестве записей.


-----
Удобный сервис для хранения файлов
 
 Top
Мелкий Супермодератор
Отправлено: 28 Декабря, 2012 - 12:19:27
Post Id



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


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


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




Toxa, да, я понял что имеется в виду. Мне такая структура и идея тоже нравится, но innodb так не умеет, что ставит фактический крест.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 28 Декабря, 2012 - 12:59:06
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




InnoDB:
CODE (SQL):
скопировать код в буфер обмена
  1. DELIMITER |
  2. CREATE TRIGGER pseudoincrement BEFORE INSERT ON messages
  3. FOR EACH ROW BEGIN
  4.    IF !NEW.message_id THEN SET NEW.message_id = (SELECT IFNULL(MAX(message_id)+1,1) FROM messages WHERE user_id=NEW.user_id);
  5.    END IF;
  6. END;
  7. |

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 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