Все ленты — последние статьи

Таблицы ключ значение и как их использовать в PHP/MYSQL

Таблицы ключ значение и как их использовать в 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')

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

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.codeforest.net/keyvalue-tables-and-how-to-use-them-in-php-and-mysql
Перевел: Станислав Протасевич
Урок создан: 5 Марта 2011