Есть проект оценок, содержащая вопросы 80шт и балы (от 1-10) на каждый ответ. Как лучше хранить ответы для работы системы
1. Есть вариант разбить таблицу бд на 81 колоноку и в каждую записывать балл.
user_id int
o1 int
o2 int,
...
o80 int;
2. Или маcсив поможет в данном случае.
user_id int,
user_otvets text;
Скажу сразу, нужно будет работать с любой произвольной оценкой и по разному.
Спустя 34 минуты, 15 секунд (22.11.2010 - 18:09) maximka787 написал(а):
Почитал информацию, вот вывел 2 метода. Какой из них используется чаще всего или есть еще какой то механизм?
или всетаки отдельно лучше хранить каждый балл в колонке?
//ПЕРВЫЙ МЕТОД
$array = array(1,2,3);
$string = serialize($array);
$array2 = unserialize($string);
print_r($array2);
//ВТОРОЙ МЕТОД
$array = array(1,2,3);
$array_input = implode(",", $array);
$array_output = explode(",", $array_input);
//print_r($array_output);
echo $array_output[0];
echo $array_output[1];
echo $array_output[2];
или всетаки отдельно лучше хранить каждый балл в колонке?
Спустя 1 день, 20 часов, 26 минут, 16 секунд (24.11.2010 - 14:36) maximka787 написал(а):
Ребят, помогите кто знает, как лучше и правильней реализовать это? Там очень просто, я сам не знаю как для системы лучше и правильней для работы сделать.. наверняка опыт есть уже у кого)
Спустя 2 минуты, 14 секунд (24.11.2010 - 14:38) linker написал(а):
Почитай про реляционную модель и поймешь как хранить.
Спустя 2 часа, 18 минут, 19 секунд (24.11.2010 - 16:56) maximka787 написал(а):
Цитата (linker @ 24.11.2010 - 11:38) |
Почитай про реляционную модель и поймешь как хранить. |
Я, если не ошибаюсь, всегда работал с реляционными БД. Тут вопрос другой, начальный вариант видимо и был правильный, верно, про большое число колонок? или вернее хранить в одной ячейке используя implode, explode
Спустя 4 часа, 58 минут, 16 секунд (24.11.2010 - 21:55) linker написал(а):
Нужно не только работать с релационными БД, но еще уметь и использовать возможности и принципы этой модели.
Спустя 14 часов, 24 минуты, 20 секунд (25.11.2010 - 12:19) maximka787 написал(а):
Цитата (linker @ 24.11.2010 - 18:55) |
уметь и использовать возможности и принципы этой модели. |
linker, я понимаю что ты владеешь отличными знаниями и помогал не раз. Пожалуйста, объясни просто хотя бы примерно метод. Я уже обчитался про реляционные модели. Если ты про разбиение на несколько таблиц объединенных один ключом, то я так делал, но получается громоздкие объемы таблиц. Прочитав про объединение массива в строку пришел к выводу что это, как минимум, большое сокращение объема информации, а значит меньше информации - легче работать. Есть, да не важно даже если и 100 вариантов ответа, ведь легче записать строку через запятую, чем создавать 100 столбцов для БД, или еще хуже разбивать таблицы на части.
Спустя 44 минуты (25.11.2010 - 13:03) linker написал(а):
Ну как бы тебе объяснить лучше и проще. Смотри, есть пользователи, у них есть некие поля (столбцы в таблице), поля должны описать только пользователей и не описывать никакие другие сущности. Есть вопросы, есть поля которые описывают только эти вопросы и ничего более. Как связать пользователей с вопросами и какая это будет связь? Связь будет N-N (многие ко многим), т.е. нужна отдельная таблица в которой будут связаны эти сущности по какому-то ключевому полю.
Спустя 20 минут, 21 секунда (25.11.2010 - 13:23) maximka787 написал(а):
Цитата (linker @ 25.11.2010 - 10:03) |
т.е. нужна отдельная таблица в которой будут связаны эти сущности по какому-то ключевому полю. |
Это я понял, я как раз писал про это выше, что одна логическая таблица разбивается на несколько физических и объединяется ключом. В моем случае связь один к одному. И вопрос был именно по поводу той таблицы, содержащей большое число ответов на вопросы юзеров. Передо мной и стоит задача делать кучу столбов или один. Если вообще схематично то
id_user
username
pass
email;
и
id_otvets
id_user
otv1
otv2
otv3
otv..n;
или
id_otvets
id_user
otveti char(255);
Спустя 20 минут, 26 секунд (25.11.2010 - 13:44) linker написал(а):
Смотри
Как связать пользователя с неким вопросом?
UsersAsk
Users Questions
Id: 1 Login: Pupkin id: 1 Question: Какое утверждение правильно?
Как связать пользователя с неким вопросом?
UsersAsk
UserId QuestionId Result
1 1 2
Спустя 28 минут, 10 секунд (25.11.2010 - 14:12) maximka787 написал(а):
Все правильно написал, наверно я не правильно описал задачу)
Есть юзеры.
Каждый авторизованный может ответить на тестовое задание 1 раз (там от 70-100 вопросов). Вопросы задаются на одной странице сразу imput-ами и передаются через POST на страницу записи их в БД.
При повторном прохождении результаты заменяются. Я просто с хранением ответов запутался, а так как обработка будет разная со временем меняться, то и результаты тестирования не записывается никуда, а только ответы пользователя, чтобы можно было извлечь их и заново пересчитать.
Есть юзеры.
Каждый авторизованный может ответить на тестовое задание 1 раз (там от 70-100 вопросов). Вопросы задаются на одной странице сразу imput-ами и передаются через POST на страницу записи их в БД.
При повторном прохождении результаты заменяются. Я просто с хранением ответов запутался, а так как обработка будет разная со временем меняться, то и результаты тестирования не записывается никуда, а только ответы пользователя, чтобы можно было извлечь их и заново пересчитать.
Спустя 9 минут, 42 секунды (25.11.2010 - 14:21) linker написал(а):
Ну и чем мое предложение не подходит к твоей схеме?
Спустя 15 минут, 45 секунд (25.11.2010 - 14:37) maximka787 написал(а):
Цитата (linker @ 25.11.2010 - 11:21) |
Ну и чем мое предложение не подходит к твоей схеме? |
я не совсем понял как хранить ответы по твоей схеме) Как преобразовать твою схему.
Даже если упростить еще сильней, то получим вообще одну таблицу. (только номера пользователей и ответы)
user_id, и ответы.
получим
id v1 v2 v3 ... vn;
1 1 2 1 3
некоторые советовали такую схему (хранить массивом)
id otvets
1 1,2,1,3,2,1,3,2,1,2;
Спустя 19 минут, 41 секунда (25.11.2010 - 14:57) linker написал(а):
Посмотри внимательно на предложенную мной табличку
UserId QuestionId ResultГде UserId - идентификатор пользователя из таблицы Users, QuestionId - идентификатор из таблицы Questions, Result собственно ответ, который дал пользователь UserId на вопрос QuestionId.
1 1 2
Спустя 13 минут, 55 секунд (25.11.2010 - 15:11) maximka787 написал(а):
Я теперь тебя понял, вечная невнимательность) но тогда таблица будет расширяться по вертикали, причем в 80-100раз больше чем моя. Разве так лучше? получиться, что на одного пользователя понадобиться 80-100 строк. У меня та же схема, только расширяется по горизонтали, а у тебя по вертикали.
Для системы разве не легче будет выдать одно значение массива через запятую, и разложить его на массив, чем выводить циклом все строки и так же соединить в массив?
Для системы разве не легче будет выдать одно значение массива через запятую, и разложить его на массив, чем выводить циклом все строки и так же соединить в массив?
Спустя 6 минут, 55 секунд (25.11.2010 - 15:18) linker написал(а):
В данном случае размер по горизонтали не имеет никакого значения, слишком мало данных, чтобы хоть как-то повлиять на размер и производительность (даже если там будут сотни тысяч записей). Установи индексы правильно и радуйся. Смотри выбираем все ответы некоего пользователя с Id = 1
SELECT `u`.`UserName`, `q`.`QuestionName`, `a`.`Result` FROM `Users` AS `u`Печатаем
LEFT JOIN `UsersAsk` AS `a` ON `a`.`UserId` = `u`.`Id`
LEFT JOIN `Questions` AS `q` ON `q`.`Id` = `a`.`QuestionId`
WHERE `u`.`Id` = 1
ORDER BY `q`.`Id` ASC
while($row = mysql_fetch_assoc($res))
{
echo 'На вопрос "' . $row['QuestionName'] . '" пользователь ' . $row['UserName'] . ' ответил : ' . $row['Result'] . '<br>';
}
Спустя 1 час, 31 минута, 49 секунд (25.11.2010 - 16:50) maximka787 написал(а):
Зачем я вообще с программированием связался) сколько раз говорил себе не лезь, если не понимаешь.
linker, все вроде понятно. Такие запросы и виды реализации БД я встречал в крутых системах, до этого сам бы не додумался, точнее избегал бы. Добавить к этому ООП и лучше пойду пончиками торговать.
В целом идея ясна. В следующий раз буду реализовывать таким методом.
Значит ты действительно не видишь ничего плохого в широкой по горизонтали таблице ( в плане удобства и производительности? )
Мне ужасно не хочется переделывать проект одного заказчика, если я оставлю
linker, все вроде понятно. Такие запросы и виды реализации БД я встречал в крутых системах, до этого сам бы не додумался, точнее избегал бы. Добавить к этому ООП и лучше пойду пончиками торговать.
В целом идея ясна. В следующий раз буду реализовывать таким методом.
Значит ты действительно не видишь ничего плохого в широкой по горизонтали таблице ( в плане удобства и производительности? )
Мне ужасно не хочется переделывать проект одного заказчика, если я оставлю
это же не будет позором или к этому нормально отнесутся программеры которые будут дорабатывать проект?
id v1 v2 v3 ...v 100... vn;
1 1 2 1 1 3
Спустя 2 минуты, 18 секунд (25.11.2010 - 16:52) linker написал(а):
Тебя будут очень сильно ругать, причем возможно даже нехорошими словами .
Спустя 4 минуты, 24 секунды (25.11.2010 - 16:56) maximka787 написал(а):
Цитата (linker @ 25.11.2010 - 13:52) |
Тебя будут очень сильно ругать, причем возможно даже нехорошими словами . |
Ладно, пусть, главное чтоб система не сломалась, я сам дорабатывал программы за разными программистами, полдня смотришь как все построено, потом только становится ясно.
Спустя 1 минута, 16 секунд (25.11.2010 - 16:58) linker написал(а):
Ну смотри
_____________
..Работает - не трогай!