2012-04-22 2 views
1

Я создаю систему построения опроса и не знаю, как лучше хранить данные. Эти два варианта можно видеть у меня есть:Чтобы сериализовать массив или не сериализовать массив: как сохранить опрос

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

Например, при использовании Сначала я бы хранить что-то вроде следующего, как упорядоченный массив:

Array 
(
    [name] => Survey 
    [sections] => Array 
     (
      [0] => Array 
       (
        [name] => Introduction 
        [pages] => Array 
         (
          [0] => Array 
           (
            [text] => Please answer the following questions. 
            [questions] => Array 
             (
              [0] => Array 
               (
                [text] => Are you male or female? 
                [answers] => Array 
                 (
                  [0] => Male 
                  [1] => Female 
                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

) 

Польза Я вижу в этом являются:

  1. Это централизованная, и
  2. Легко редактировать в сценарии с помощью простого запроса, как:

    UPDATE surveys SET data = '$serialized_array' 
    

Основной недостаток я вижу в этом есть:

  1. Трудно редактировать вне сценария (например, при использовании Navicat, например)

Я также слышал, что плохая практика хранения данных в виде сериализованного массива. Хотя я предполагаю, что это полностью зависит от контекста (или тот, с кем я это слышал, ошибается).

С помощью второго (хранящего каждый элемент в виде отдельной строки в соответствующей таблице), я бы иметь структуру базы данных, как это:

обследования

id name 

1 Survey 

секция

id name   survey_id index 

1 Introduction 1   0 

страницы

id text       section_id index 

1 Please answer these questions. 1   0 

вопросы

id text     page_id index 

1 Are you male or female? 1  0 

отвечает

id text question_id index 

1 Male 1   0 
2 Female 1   1 

Преимущества я вижу в этом являются:

  1. Существует лучшее разделение контента и
  2. легче редактировать вне сценария (например, при использовании Navicat, например)

Основной недостаток я вижу в этом есть:

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

Мой вопрос к вам это:, какой из этих двух методов (если это действительно так) лучше подходит для задачи? У меня возникает соблазн сохранить данные в виде сериализованного массива, поскольку он кажется намного проще в создании и упрощении управления. Хотя я вижу ... elegance ... храня данные в виде отдельных строк в соответствующих таблицах.

Если это имеет значение, на данный момент опрос строится с использованием JavaScript: элементы HTML добавляются, удаляются и повторно заказываются с использованием (в частности) jQuery, а затем готовый продукт представляется в форме (с $_POST массив, который я привел выше).

+0

вопрос может быть спорным, если вы готовы рассмотреть другую базу данных, как документ магазина, такие как MongoDB. – cmbuckley

+0

Это выглядит интересно. Хотя, я не создаю эту систему опроса исключительно для собственного использования, но для всех и каждого, чтобы загрузить и реализовать их, поэтому было бы лучше, если бы не полагаться на менее часто используемые сторонние программы – MichaelRushton

ответ

3

Сохранение ваших данных в нормализованной форме, вероятно, путь сюда. Когда вы собираете ответы от своих пользователей, это типично, потому что вы хотите выполнить некоторый анализ результатов.

При хранении в нормализованной форме легко, например, посмотреть, какой процент респондентов, где мужчина/женщина.

SELECT text, COUNT(*) AS count 
FROM answers 
WHERE question_id = 1 
GROUP BY text 
+0

Я думаю, что хранение данные в нормализованной форме имеют другие преимущества в долгосрочной перспективе. Вы можете легко добавлять новые типы вопросов и ответов (например, множественный выбор или заполнение значения). Кроме того, некоторые вопросы могут быть заархивированы или помечены как закрытые и так далее. Хранение их в базе данных позволяет легко добавлять новые свойства и обеспечивает большую гибкость. –

+0

Да, я определенно вижу здесь выгоду. Хотя это затрудняло бы построение исследования, оно облегчает отчетность об этом (и одноразовые отчеты в стиле обычного пользователя тривиальны, если простой SQL-запрос - это все, что нужно, а не сложный PHP-скрипт для анализа сериализованного массива). – MichaelRushton

0

Я хотел бы сказать, что вариант 1 является более гибким, и вариантом 2 является более эффективным, так что выбор между эффективностью и адаптивностью. Эффективность достигается за счет переменных базы данных, а не на дополнительном этапе синтаксического анализа сериализованных строк. Адаптивность, поскольку структура данных может быть разной для разных опросов, например, без фактической модификации базы данных. Кроме того, типы данных не нужно определять.

0

Хранение в базе данных лучше, чем хранение в сериализованной форме. Кроме того, рассмотрите возможность хранения данных в файлах конфигурации, которые можно легко прочитать и отредактировать вне сценария (json, yaml, ini formats). Существуют простые методы для чтения и записи этих форматов в PHP.

1

Вопросы, которые я бы задаю себе:

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

Или: Кто-нибудь еще ?!

Я хотел бы получить сериализованное хранилище только в том случае, если я создаю какой-то «мертвый конец данных», то есть знаю, что данные редко или никогда не будут редактироваться снова.

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

мои 2 цента.

-1

На мой взгляд, самый удобный способ хранения данных в базе данных, по следующим причинам:

  1. формате кросс-платформенный;
  2. SQL - хорошо известный стандарт;
  3. PHP + SQL - очень хорошая комбинация;
  4. База данных SQL имеет статистику;
  5. Хорошая поддержка в виде литературы и т.д ...
+0

Это не то, о чем спрашивает @MichaelRushton. Он спрашивает, что является лучшим способом хранения данных в базе данных. – justinhartman

Смежные вопросы