Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 11.06.2011, 21:34   #1
Заблокирован
 Разведчик
Аватар для Я убью:Frost:DD
 
Я убью:Frost:DD на правильном пути
Регистрация: 06.06.2011
Сообщений: 20
Популярность: 74
Сказал(а) спасибо: 65
Поблагодарили 32 раз(а) в 22 сообщениях
 
По умолчанию Таблицы ключ значение и как их использовать в PHP/MYSQL

Эта статья для продвинутых программистов, но и новички смогут всё понять, если будут внимательны. Применение принципа ключ значение в таблицах бывает полезно тогда, когда нам в одной таблице необходимо хранить информацию о другой таблице. Предположим, что у нас есть таблица пользователей. И всё было бы хорошо, но однажды босс захотел хранить ещё несколько телефонов, пол, дату рождения…

Если вы попытаетесь предугадать все пожелания начальника, то ваша таблица будет постоянно расти в горизонтальном направлении.

Тут-то нам и пригодятся таблицы ключ значение. Создадим таблицу для пользователей:1 CREATE TABLE IF NOT EXISTS `users` (
2 `id` int(11) NOT NULL AUTO_INCREMENT,
3 `username` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
4 `pass` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
5 PRIMARY KEY (`id`)
6 ) ENGINE=MyISAM ;


В ней будут хранится самые примитивные данные. Ну а теперь создадим дополнительную таблицу, в которой будем хранить всё остальное.1 CREATE TABLE IF NOT EXISTS`user_details` (
2 `id` int(11) NOT NULL AUTO_INCREMENT,
3 `user_id` int(11) NOT NULL,
4 `key` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
5 `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
6 PRIMARY KEY (`id`)
7 ) ENGINE=MyISAM;


На самом деле поля key и value будут хранить информацию о пользователе. Поскольку в такой таблице информация будет расти вертикально, то мы можем в любой момент добавить новые атрибуты пользователя.

Довольно лирики. Теперь для того, чтобы вставлять данные в эту таблицу, нам необходимо использовать запросы типа:1 UPDATE user_data SET value = 'What?' WHERE key = 'date_of_birth'


Таким образом у нас есть ключ, по которому мы будем искать необходимое нам значение. Однако в этом способе есть и свои минусы. Допустим нам надо найти всех пользователей из Чикаго. Имея одну таблицу, мы бы это сделали так:1 SELECT username FROM users WHERE city = 'Chicago'


Всё просто. С таблицами ключ значение будет посложнее:1 SELECT username FROM users a
2 INNER JOIN user_data b
3 ON a.id = b.user_id
4 WHERE b.key = 'city'
5 AND b.value = 'Chicago'


Довольно-таки громоздко для такой простой задачи. Но это ещё не самое страшное. Проблемы начинаются там, где нам надо произвести поиск по нескольким критериям. В случае с одной таблицей эта задача решается так:1 SELECT username FROM users WHERE city = 'Chicago' AND state = 'Illinois'


Если вы используете таблицы ключ значение, то можете попасться в капкан следующего выражения:1 SELECT username FROM users a
2 INNER JOIN user_data b
3 ON a.id = b.user_id
4 WHERE
5 (b.key = 'city' AND b.value = 'Chicago')
6 AND
7 (b.key = 'state' AND b.value = 'Illinois')


Но это выражение всегда вернут 0. Это происходит потому, что в базе никогда не будет одной и той же строки, которая содержит 2 значения одновременно.

Но решение есть – похожее на монстра:1 SELECT username FROM users a
2 INNER JOIN user_data b
3 ON a.id = b.user_id
4 INNER JOIN user_data c
5 ON b.user_id = c.user_id
6 WHERE
7 (b.key = 'city' AND b.value = 'Chicago')
8 AND
9 (c.key = 'state' AND c.value = 'Illinois')
  Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
ПодпольщикPB (12.06.2011), ololoshnik212 (11.06.2011)
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] чит таблицы сергей767 Свободное обсуждение 2 13.12.2010 13:42
[Информация] таблицы sazki2 Dark Orbit 0 26.07.2010 22:52

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 17:52.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net