|
11.06.2011, 21:34
|
#1
|
|
|
|
Разведчик
|
Регистрация: 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пасибо:
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Помогите!] чит таблицы
|
сергей767 |
Свободное обсуждение |
2 |
13.12.2010 13:42 |
[Информация] таблицы
|
sazki2 |
Dark Orbit |
0 |
26.07.2010 22:52 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 17:52.
|
|