2014-10-30 4 views
0

Я довольно новичок в PHP/MYSQL, у меня есть веб-сайт с несколькими длинными формами, и многие из них добавляются на регулярной основе. Данные из всех форм хранятся в таблице данных «data» MYSQL.MYSQL - Сохранение множества текстовых полей в одной строке

Способ, которым я обращался к хранению данных, состоял в том, чтобы иметь 200 текстовых столбцов (поскольку мои формы занимают до 200 вопросов). Не каждый вопрос нуждается в текстовом столбце, около 50% - это только целые числа или несколько ответов на слова, но поскольку они меняются по порядку, это был самый простой способ заставить его работать.

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

размер строки слишком велик (> 8126). Изменение некоторых столбцов до TEXT или BLOB или использование ROW_FORMAT=DYNAMIC или ROW_FORMAT=COMPRESSED может помочь. В формате текущей строки префикс BLOB из 768 байт хранится в строке.

Где я ошибаюсь и как лучше всего хранить данные? Я знаю, что 200 столбцов кажутся много, и я читал, это должно означать, что я не нормализовал свои данные должным образом, но создание большого количества таблиц в этом случае не кажется разумным, так как все данные подключены на одном уровне к форме, из которой он пришел. Разделить его на 20 таблиц с данными 1-10 11-20 21-30 просто не кажется правильным?

Любая помощь будет высоко оценена.

+0

У вас должен быть сохранен каждый вопрос как строка, и в каждой строке есть имя столбца f.e. id_field ... Тогда в вашей таблице не будет 200 столбцов, но только пара (зависит от других столбцов в вашей таблице) ... – Legionar

+0

Спасибо! Это то, что я искал, просто так и не подумал об этом, нет причин, почему все ответы должны быть в одном ряду! Лампочка момент! – Matt

+0

Я просто добавил это также как ответ :-) – Legionar

ответ

0

Это тот случай, когда вы должны рассмотреть NoSQL. У вас нет фиксированной схемы.
Рассмотрите возможность использования MongoDBTutorial

// connect 
$m = new MongoClient(); 

// select a database 
$db = $m->comedy; 

// select a collection (analogous to a relational database's table) 
$collection = $db->cartoons; 

// add a record 
$document = array("title" => "Calvin and Hobbes", "author" => "Bill Watterson"); 
$collection->insert($document); 

// add another record, with a different "shape" 
$document = array("title" => "XKCD", "online" => true); 
$collection->insert($document); 

// find everything in the collection 
$cursor = $collection->find(); 

// iterate through the results 
foreach ($cursor as $document) { 
    echo $document["title"] . "\n"; 
} 
1

Создайте таблицу, в которой каждое поле представляет собой отдельную строку:

CREATE TABLE Question_Fields (
    question_id INT, -- FK to Question table 
    field_num INT, 
    field_value VARCHAR(1024) 
); 

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

+0

Спасибо за ваш ответ, означало бы это, что мне нужна новая таблица для каждого набора данных? Формы будут заполнены в 100 раз. – Matt

+0

Нет, вам просто нужен этот один стол. Все, что вы делаете, это перемещение всех этих текстовых столбцов из таблицы вопросов и в строки в этой таблице. Внешний ключ связывает их с исходной строкой в ​​таблице вопросов. – Barmar

0

У вас должен быть сохранен каждый вопрос как строка, и в каждой строке есть имя столбца f.e. id_field ... Тогда в вашей таблице не будет 200 столбцов, но только пара (зависит от других столбцов в вашей таблице) ...

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