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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбор способа хранения и обработки данных. XML или БД. 
:(
    Опции темы
iddqd
Дата 16.6.2010, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть достаточно сложная и путанная структура данных. И путаный требуемый алгоритм их обработки. Сейчас все данные и вопросы и конечный текст в XML.
Итак.
Пользователь выбирает какой-то пункт при опросе.
Цитата

Вопрос 1. Сколько будет 2+2?
1. 4
2. 3
3. 5

Цитата

Вопрос 2. Есть ли жизнь на Марсе?
1. Да
2. Нет
3. Привет

И так еще большое количество вопросов.
Затем происходит вывод текста из XML.
Допустим, пользователь выбрал в первом вопросе 2, а во втором — 1. Запишем это в виде переменных v_1  = 2 и v_2 = 1. Тут у нас v_1 это вопрос 1, ну и v_2 — вы поняли.

В XML с текстом, про который я писал выше у нас есть вот такие заманчивые конструкции:
Код

        <p id="p1">
            <text>
                <![CDATA[Если выбрали ответ один]]>
            </text>
            <dependencies>
                <dependence option="v_1" condition="=" value="1"/> <!-- ОБРАТИТЕ ВНИМАНИЕ -->
            </dependencies>
        </p>
        <p id="p2">
            <text>
                <![CDATA[Если выбрали ответ два]]>
            </text>
            <dependencies>
                <dependence option="v_1" condition="=" value="2"/> <!-- ЕЩЕ РАЗ ОБРАТИТЕ ВНИМАНИЕ -->
            </dependencies>
        </p>


Суть заключается в том, что если пользователь выбрал в первом вопросе 1, то мы выводим "Если выбрали ответ один", а если выбрал пункт 2, то выводим "Если выбрали ответ два".

Да, с помощью PHP я легко разберу этот XML и выведу нужные мне данные. Но до каких пор возможностей XML будет хватать? Уже сейчас, при не большой посещаемости (~ 500 человек/сутки) я вижу, что не хватает сил. И хочу перейти на нормальную БД. Например, MySQL.
Как мне это сделать?
Еще раз подведу итог сложности: мне нужно выводить большое количество текста. В зависимости от выбора пользователя текст (местами) может подставляться разный. В БД я намерен хранить весь текст. Как мне это сделать правильно? Именно хранение разных данных и выбор нужной строки в зависимости от выбора пользователя?
Спасибо заранее. Надеюсь, хоть что-то мне удалось разъяснить.



--------------------
PM MAIL   Вверх
smartov
Дата 16.6.2010, 23:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

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



Перевести в общем не сложно. Правда есть нюансы. 
Если количество ответов на вопрос - величина статическая (например всегда 3, как в примерах) либо не статическая но "не больше N" где N - число до 10, то я бы таблицу вопросов сделал так:

Код

CREATE  TABLE `questions` (
    `id` INT NOT NULL ,
    `question` VARCHAR( 255 ) NOT NULL ,
    `answer1` VARCHAR( 128 ) NOT NULL ,
    `answer2` VARCHAR( 128 ) NOT NULL ,
    `answer3` VARCHAR( 128 ) NOT NULL
)


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

Далее, учитывая, что количество текста на вывод после ответов большое, то он будет выделен в отдельную таблицу.

Код

CREATE  TABLE `replies` (
    `id` INT NOT NULL ,
    `body` TEXT NOT NULL
)


А связующим звеном выступит таблица, описательное название которй я не осилил придумать

Код

CREATE  TABLE `noname_link` (
    `id_question` INT NOT NULL ,
    `id_answer` INT NOT NULL ,
    `id_reply` INT NOT NULL
)


Для пущеё важности по полям id_question и id_answer можно создать индексы.

Ну а теперь:
Цитата(iddqd @  16.6.2010,  22:42 Найти цитируемый пост)
Допустим, пользователь выбрал в первом вопросе 2, а во втором — 1. 

Теперь нет смысла складывать это в переменные, да и вообще неудобно это. 
Лучше складывать в массив, пусть будет $results. Причем не просто складывать, а в виде строк, подготовленных по шаблону
Код

$results[] = sprintf('(`id_question` = %d and `id_answer` = %d)', $question_number, $answer_number);

Думаю имена переменных описательны и понятно что куда совать.


Таким образом после всех ответов (Допустим, пользователь выбрал в первом вопросе 2, а во втором — 1) выйдет примерно такой массив:
Код

Array(2) {
    [0] => '(`id_question` = 1 and `id_answer` = 2)',
    [1] => '(`id_question` = 2 and `id_answer` = 1)'
}

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

Готовим кусок текста для запроса - объединяем массив.
Код

    $results = implode(" OR ", $results);

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

Ну а сам запрос будет выглядеть вот так:
Код

$request = '
SELECT * FROM replies WHERE id IN 
(
    SELECT id_reply FROM `noname_link` WHERE '.$results.'
)';


То есть по сути, запрос, который увидит SQL сервер будет такой
Код

SELECT * FROM replies WHERE id IN 
(
    SELECT id_reply FROM `noname_link` WHERE (`id_question` = 1 and `id_answer` = 2) OR (`id_question` = 2 and `id_answer` = 1)
)


Нужно учесть однно ограничение. Если вопросов в опроснике очень много - можно превысить длину SQL запроса. Тогда надо будет либо её увеличивать на сервере, либо разбивать изначальный массив $results на несколько массивов и вытягивать текст "ответов" за несколько запросов.
PM MAIL   Вверх
iddqd
Дата 17.6.2010, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ой, спасибо огромное.
Кажется, это как раз то, что мне нужно. Сейчас вот только чуть-чуть вникну в это все.


--------------------
PM MAIL   Вверх
iddqd
Дата 17.6.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



После длительных размышлений я пришел вот к какому выводу.
Оказывается, можно все упростить и убрать предварительный опрос пользователя. Но тогда ему нужно предоставить возможность выбора прямо на странице.
Выглядеть это будет примерно так:
Цитата

Какой-то умный текст Если выбрали ответ один и опять какой-то текст.

Так вот этот самый "Если выбрали ответ один" будет кликабельным и при клике будут всплывать все варианты, которые были при голосовании еще.
Пожалуйста, подскажите, как в таком случае меняется структура данных, а то слабоват я в этом? Но явно вижу, что меняется. Только вот понять не могу — проще или сложней становится.


--------------------
PM MAIL   Вверх
ksnk
Дата 17.6.2010, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



По моему - возможности xml еще не исчерпаны smile
Вообще говоря, нужно хранить достаточно развесистую, вероятно с циклами, деревянную структуру в xml?
Можно посоветовать поменять структуру
Код

<qa>
<question name="1">
   <text>Сколько будет 2+2</text>
   <answer rel="2">4</answer>
   <answer rel="20">3</answer>
   <answer rel="20">5</answer>
</question>
<question name="2">
   <text>Есть ли жизнь на Марсе?</text>
   <answer rel="2">4</answer>
   <answer rel="20">3</answer>
   <answer rel="20">5</answer>
</question>
...
<question name="20">
   <text>Сколько будет 1+1</text>
   <answer rel="2">2</answer>
   <answer rel="dumb">1</answer>
   <answer rel="dumb">3</answer>
</question>
...
</qa>
 то есть у каждого ответа есть атрибут - номер следующего вопроса. 

Кстати, чем и как делается разбор xlm? Какого размера примерно файл с данными?

Текстовый файл удобнее базы тем что он текстовый и его можно менять где угодно. Для базы нужно писать специальную тулзу для редактирования.

Это сообщение отредактировал(а) ksnk - 17.6.2010, 09:43


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


Опытный
**


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

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



ksnk, хочу совсем уйти от модели с вопросами, а делать так, как я написал в последнем своем сообщении.
Размеры файлов не очень большие. Дело в том, что речь про текстовые статьи. Текст в них частично может меняться в зависимости от выбора пользователя. Всего статей порядка 200 и каждая из них хранится в своем XML-файле размером от 5Кб до 100Кб.

Добавлено через 3 минуты и 39 секунд
Еще вот сейчас появилась идея про использование XSLT для разбора XML, но пока разбираюсь с самим XSLT и с чем его едят.


--------------------
PM MAIL   Вверх
iddqd
Дата 17.6.2010, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На первый взгляд, XSLT вполне способен справится с моей задачей. Но в связи с этим вопрос: не будет ли нагрузка на сервер все же выше, чем при работе с MySQL. Мне кажется, будет.


--------------------
PM MAIL   Вверх
Severyanin
Дата 17.6.2010, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

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



iddqd, я думаю, что если использовать xml-технологии, то тут лучше всего подойдет не xslt, а xpath. На нем можно писать достаточно серьезные запросы, не уступающие по сложности sql, но я все-же советую использовать БД для лучшей масштабируемости


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 17.6.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(iddqd @  17.6.2010,  09:50 Найти цитируемый пост)
 Всего статей порядка 200 и каждая из них хранится в своем XML-файле размером от 5Кб до 100Кб.

Это - imho, очень большой объем, чтобы рассуждать об обработке его с помощью xml в php. Лучше вытаскивать данные из базы. Или в xml оставить компактную управляющую структуру, а данные большого объема красиво разбросать по файловой системе... 
Проблема xml в том, что весь файл сначала закачивается в память, парсится и потом обрабатывается. Если файл большой - работа с ним существенно замедляется. Возможно есть приличные кэширующие xml-читалки для php, но я сужу по simplexml...

Цитата(iddqd @  17.6.2010,  09:30 Найти цитируемый пост)
После длительных размышлений я пришел вот к какому выводу.
Оказывается, можно все упростить ... предоставить возможность выбора прямо на странице.
Выглядеть это будет примерно так:
Цитата

Какой-то умный текст Если выбрали ответ один и опять какой-то текст.


Так вот этот самый "Если выбрали ответ один" будет кликабельным ...

Это описание Hypertext Markup Language?  smile 
Честно говоря не очень понял идею, можно её ещё раз пояснить? что вообще такое делается?


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


Опытный
**


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

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



Давайте не будем вникать в совсем уж детали, которые ничего не меняют.
Я вот техническое задание даже написал в поисках того человека, кто может сделать, но желающих нет и делать, видимо, буду сам.
Так что дам ссылку, чтобы желающие помочь советом могли лучше вникнуть. Ссылка вот.
Меня интересует именно лучшая реализация. Пока вникаю в XSL.


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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