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
Форумы портала PHP.SU :: Версия для печати :: Зависимый AUTO_INCREMENT
Форумы портала PHP.SU » » Работа с СУБД » Зависимый AUTO_INCREMENT

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

1. Toxa - 27 Декабря, 2012 - 22:31:28 - перейти к сообщению
Вы обращали внимание, как вконтакте организован доступ к контенту?
Примерно так 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, но я не стал усложнять, это всего лишь пример
2. Мелкий - 28 Декабря, 2012 - 08:38:00 - перейти к сообщению
Toxa пишет:
выборка будет явно быстрее.

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

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

Объявить message_id автоинкрементом. Всё.
Работает только на myisam, потому вариант весьма неважный.
3. LIME - 28 Декабря, 2012 - 10:10:38 - перейти к сообщению

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

Вся база хранится на в виде постов на странице Дурова в ВК в скрытых полях типа hidden, выводимых из файла base.txt. Таким образом достигается коварное многоуровневое и дублированное кеширование и раздача данных всей бд ВК средствами JS из кук и localstorов браузеров всех посетителей страницы Дурова
5. Toxa - 28 Декабря, 2012 - 12:05:24 - перейти к сообщению
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. +---------+------------+----------+

в этом случае не будет диких значений в ключах при сколь угодно большом количестве записей.
6. Мелкий - 28 Декабря, 2012 - 12:19:27 - перейти к сообщению
Toxa, да, я понял что имеется в виду. Мне такая структура и идея тоже нравится, но innodb так не умеет, что ставит фактический крест.
7. EuGen - 28 Декабря, 2012 - 12:59:06 - перейти к сообщению
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. |

?

 

Powered by ExBB FM 1.0 RC1