Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2011, 14:43   #11
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
А по сему подскажите пожалуйста как построить запрос к базе в случае хранения ассоциативного массива в сериализированной строке?
Точно также как и в вашем случае - написать пользовательскую функцию, которая извлекает массив, меняет и снова сериализует и сохраняет.
Цитата:
Но ИМХО - мне удобнее работать с обним столбцом, а не с 50-тью.
Вы им что гвозди забиваете? Не вижу никаких проблем, это ваши предубеждения.
Цитата:
BIGINT имеет размер 8 байт
Да, в этом случае мы имеем выгоду при более 8 параметров и проигрыш при меньшем количестве.

Тут ошибка в логике.
Вы работаете только с БД. Так никто не делает.
Вам же сказали: при инициализации вытаскиваете массив настроек в сессию и работаете с ней без обращения к БД - выгода в сотни раз больше, чем от того способа, который вы предложили.
Виталий Желтяков вне форума Ответить с цитированием
Старый 22.04.2011, 23:53   #12
AlexanderGalkin
Пользователь
 
Регистрация: 17.04.2011
Сообщений: 11
По умолчанию

Вопрос был:

А по сему подскажите пожалуйста как построить запрос к базе в случае хранения ассоциативного массива в сериализированной строке?

Цитата:
Точно также как и в вашем случае - написать пользовательскую функцию, которая извлекает массив, меняет и снова сериализует и сохраняет.
Вопрос не касался PHP. Напишите пожалуйста SQL запрос если значения хранятся в сериализированной строке.

Учту пожелания, с сессией действительно работал немного, поэтому и развил логику по работе с БД.
AlexanderGalkin вне форума Ответить с цитированием
Старый 22.04.2011, 23:54   #13
AlexanderGalkin
Пользователь
 
Регистрация: 17.04.2011
Сообщений: 11
По умолчанию

Вопрос был:

А по сему подскажите пожалуйста как построить запрос к базе в случае хранения ассоциативного массива в сериализированной строке?

Цитата:
Точно также как и в вашем случае - написать пользовательскую функцию, которая извлекает массив, меняет и снова сериализует и сохраняет.
Вопрос не касался PHP. Напишите пожалуйста SQL запрос если значения хранятся в сериализированной строке.

Учту пожелания, с сессией действительно работал немного, поэтому и развил логику по работе с БД.
AlexanderGalkin вне форума Ответить с цитированием
Старый 23.04.2011, 00:09   #14
AlexanderGalkin
Пользователь
 
Регистрация: 17.04.2011
Сообщений: 11
По умолчанию

Цитата:
Вам же сказали: при инициализации вытаскиваете массив настроек в сессию и работаете с ней без обращения к БД - выгода в сотни раз больше, чем от того способа, который вы предложили.
Забыл упомянуть один важный момент, меня интересуют настройки многих пользователей, а не текущего. Скажем есть "контакты" пользователя, у которых есть "темы" на форуме. У каждого пользователя есть настройки "приватности просмотра тем".

Когда же необходимо вывести список тем контактов, проверяются настройки каждого контакта(пользователя). При храненнии в сериализованной строке приходилось бы настройки каждого контакта стягивать отдельным запросом и только потом делать зарос на темы. В даном случае помогло бы хранение 20-ти параметров в разных колонках. Но мне эта идея не понравилась.

Цитата:
Вы им что гвозди забиваете? Не вижу никаких проблем, это ваши предубеждения.
У каждого свои предубеждения. Не вижу в этом ничего плохого.
AlexanderGalkin вне форума Ответить с цитированием
Старый 23.04.2011, 08:32   #15
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Вопрос не касался PHP. Напишите пожалуйста SQL запрос если значения хранятся в сериализированной строке.
Это не возможно, да и не нужно. Разберитесь с сессиями поймёте почему.
Цитата:
Когда же необходимо вывести список тем контактов, проверяются настройки каждого контакта(пользователя). При храненнии в сериализованной строке приходилось бы настройки каждого контакта стягивать отдельным запросом и только потом делать зарос на темы. В даном случае помогло бы хранение 20-ти параметров в разных колонках. Но мне эта идея не понравилась.
Не понимаю, что Вы хотите сделать. По моему, как ни крути, все равно придётся делать запрос к настройкам пользователя, а потом к таблице статей.
Виталий Желтяков вне форума Ответить с цитированием
Старый 03.05.2011, 14:12   #16
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
Сообщение Не всё так плохо, как могло бы

Самому пришлось немного с этим работать (правда причина была не в желании уменьшить базу, а в совместимости с бинарной-хип базой).

Для БД лучше использовать битвайз-функции самого Mysql, а не посылать лишние селекты/апдейты, как тут

Код:
    $query = 'SELECT user_options FROM table_users WHERE user_id='.$user_id.';';
    $result = mysql_query($query);
...
            $query = 'UPDATE table_users SET user_options='.$new_val.' WHERE user_id='.$user_id.';'; 
            $result = mysql_query($query);

можно ставить как-то сразу вот так (не проверял, но должно вроде работать)

Код:
$query = 'UPDATE table_users SET user_options=user_options | '.pow(2,$opt_ind-1).' WHERE user_id='.$user_id.';'; 
            $result = mysql_query($query);
и вот так снимать

Код:
$query = 'UPDATE table_users SET user_options=user_options & ~'.pow(2,$opt_ind-1).' WHERE user_id='.$user_id.';'; 
            $result = mysql_query($query);
смотрите тут http://dev.mysql.com/doc/refman/5.0/...functions.html

Вот это вот:

Цитата:
Для того, чтобы вывести список всех пользователей, у которых 9й параметр равен единице, можно использовать следующий запрос:

Код:
SELECT * FROM table_users WHERE IF(LENGTH(BIN(table_users.user_options))<9, 0,  LEFT(RIGHT(BIN(table_users.user_options),9),1))=1;
Тоже несколько тяжеловесно, используйте условие

Код:
table_users.user_options&512<>0
512 откуда взялось, думаю понятно.

Кроме того, становится достаточно просто сделать выборку на совпадение 2-х и более опций. (через битвайз-ор и энд, т.е. 1 и 9 опции - это 513 и т.д.)
Если необходимо сделать проверку на выключенные и включённые опции одновременно в 1 условии можно использовать маску.


и вообще, вместо pow() советую использовать предопределённый массив со степенями, дешевше выйдет.
graymaster вне форума Ответить с цитированием
Старый 10.11.2013, 21:04   #17
AlexanderGalkin
Пользователь
 
Регистрация: 17.04.2011
Сообщений: 11
По умолчанию

На днях ковырял фреймворк Symfony2 и обнаружил, что в его компоненте ACL как раз таки используется число (маска) для хранения прав пользователя.

https://github.com/symfony/symfony/b...askBuilder.php

Не совсем тоже самое, что описано выше, но идея схожа.
AlexanderGalkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хранение БД в одном файле D_E_N БД в Delphi 3 18.07.2009 14:01
изменение нескольких переменных в одном методе. goog Общие вопросы по Java, Java SE, Kotlin 5 01.03.2009 20:46
Прибавление логических функций Slavik Microsoft Office Excel 19 26.01.2009 23:39
Использование логических функций Клубничка Microsoft Office Excel 52 15.01.2009 15:01
Свой тип данных в Delphi - сверх длинные числа - хранение в переменных размером до 1 MB KLaiM Общие вопросы Delphi 9 16.06.2007 09:13