Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация поиска по сериализованным данным, нужна помощь в выборе решения 
:(
    Опции темы
abs32
  Дата 30.8.2012, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.9.2009

Репутация: 1
Всего: 1



Всем доброго времени суток.

От предыдущего разработчика досталась база данных в которой записи хранятся в сериализованном виде.
Нужно сделать поиск по этим данным.

Сериализация/десериализация реализована функциями  serialize/unserialize.
Возможные варианты решения:

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

2) Добавить новую таблицу с нужной структурой, которая будет дублировать данные из исходной таблицы. Плохо, данные дублируются.

3) Делать поиск в php-скрипте. Медленно.

4) Использовать библиотеки типа lucene с поиском по индексу. ( кажется бредом но все равно запишу )


Какое решение вы мне посоветуете ?


PM MAIL   Вверх
Sanchezzz
Дата 30.8.2012, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



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

Код

    /**
    * TODO подготовка слова для поиска под Like в sql
    * @param $arrOrStr array
    */
    function getPrepareCondition($arrOrStr){
        $sql = sprintf("'%s%s%s'", '%', serialize($arrOrStr), '%');
        return $sql;
    }
    print     getPrepareCondition( array('data'=>'Искомое %Слово') );
       // Получаем '%a:1:{s:4:"data";s:26:"Искомое %Слово";}%' вполне подойдет для поиска
      //   колонка Like полученные данные



с регуляркой похожий способ

Это сообщение отредактировал(а) Sanchezzz - 30.8.2012, 18:08


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
ksnk
Дата 30.8.2012, 18:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(abs32 @  30.8.2012,  16:37 Найти цитируемый пост)
Избавиться от сериализованных данных, выделив под каждый параметр столбец. В этом случае нужна будет переделка всего кода работающего с данной таблицей.

Код работы с таблицей равномерно размазан по коду? Возможно пора отрефакторить?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sentox
Дата 30.8.2012, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата

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

Иногда это просто не возможно. Так как концепция может иметь динамическое число данных/параметров, или вообще не иметь, или иметь какое то состояние, причём все с разными параметрами. Это реляционная БД, не объектная, хотя может есть подход избавиться от этого, но пока знаю один способ сохранения состояния в БД, это сериализация. Других способов не придумали. Было бы конечно отлично, если бы на платформе Mysql сделали поиск по сериализованным данным, но увы smile
Конечно если число параметров статично, тогда стоило бы рефакторнуть в нормальную таблицу.
Вариант поиска на платформе БД можно посмотреть здесь:
http://phpforum.ru/index.php?showtopic=52896
http://stackoverflow.com/questions/4116419...erialized-array
http://www.sfmysql.org/messages/boards/thr...?thread=1186429

Это сообщение отредактировал(а) Sentox - 30.8.2012, 20:33
PM MAIL   Вверх
Sanchezzz
Дата 30.8.2012, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Перенести можно путем создание таблицы с полями id(инкремент), key, value, idtable где idtable id связного поля откуда вязли массив  key имя из массива ну value это значение. 
Такое можно переменить если массив одномерный и состоит по ключам

Это сообщение отредактировал(а) Sanchezzz - 30.8.2012, 20:59


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Sentox
Дата 30.8.2012, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(Sanchezzz @ 30.8.2012,  20:57)
Перенести можно путем создание таблицы с полями id(инкремент), key, value, idtable где idtable id связного поля откуда вязли массив  key имя из массива ну value это значение. 
Такое можно переменить если массив одномерный и состоит по ключам

Супер smile, спасибо , я блин что то под усталость и забыл связные таблицы, и как раз необходимость в них появилась, завтра на тесты посажу.
Но всё таки сложные и динамические состояния стоит хранить в сериализованном виде.
PM MAIL   Вверх
abs32
Дата 10.9.2012, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.9.2009

Репутация: 1
Всего: 1



Цитата(Sentox @ 30.8.2012,  20:13)
Цитата

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

Иногда это просто не возможно. Так как концепция может иметь динамическое число данных/параметров, или вообще не иметь, или иметь какое то состояние, причём все с разными параметрами. Это реляционная БД, не объектная, хотя может есть подход избавиться от этого, но пока знаю один способ сохранения состояния в БД, это сериализация. Других способов не придумали. Было бы конечно отлично, если бы на платформе Mysql сделали поиск по сериализованным данным, но увы smile
Конечно если число параметров статично, тогда стоило бы рефакторнуть в нормальную таблицу.
Вариант поиска на платформе БД можно посмотреть здесь:
http://phpforum.ru/index.php?showtopic=52896
http://stackoverflow.com/questions/4116419...erialized-array
http://www.sfmysql.org/messages/boards/thr...?thread=1186429


У меня не тот случай. Число парамеров статично.
Кстати, я пока еще не встречался с задачами где бы использовалось динамическое кол-во параметров.

В общем все свелось к рефакторингу БД и кода. 
Некоторые условия ТЗ было не возможно выполнть без изменения структуры храниения данных. 
И легче было сделать рефакторинг, чем разбираться с запутанной логикой обработки сериализованных данных.

Это сообщение отредактировал(а) abs32 - 10.9.2012, 19:40
PM MAIL   Вверх
Sanchezzz
Дата 11.9.2012, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Цитата

Кстати, я пока еще не встречался с задачами где бы использовалось динамическое кол-во параметров.

abs32, я вам подскажу 2 разных по типу параметрам объекта в одной базе и в тех же таблицах.

У объекта А 10 полей
У объекта  B  23 поля.

Банальный пример недвижимость
У дач свои поля
У квартир свои
У сниму квартиры немножко меньше полей

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









--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0666 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.