[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: массив или колонки таблицы
maximka787
Ребят, я тут еще один проект делаю. В прошлый раз общались долго и не пришли к выводу толком никакому. Сразу задам вопрос как есть, а там уже проще подумать.
Есть проект оценок, содержащая вопросы 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 написал(а):
Смотри

       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 на страницу записи их в БД.
При повторном прохождении результаты заменяются. Я просто с хранением ответов запутался, а так как обработка будет разная со временем меняться, то и результаты тестирования не записывается никуда, а только ответы пользователя, чтобы можно было извлечь их и заново пересчитать.

Спустя 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
1 1 2
Где UserId - идентификатор пользователя из таблицы Users, QuestionId - идентификатор из таблицы Questions, Result собственно ответ, который дал пользователь UserId на вопрос QuestionId.

Спустя 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, все вроде понятно. Такие запросы и виды реализации БД я встречал в крутых системах, до этого сам бы не додумался, точнее избегал бы. Добавить к этому ООП и лучше пойду пончиками торговать.

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

Значит ты действительно не видишь ничего плохого в широкой по горизонтали таблице ( в плане удобства и производительности? )
Мне ужасно не хочется переделывать проект одного заказчика, если я оставлю

id v1 v2 v3 ...v 100... vn;
1 1 2 1 1 3
это же не будет позором или к этому нормально отнесутся программеры которые будут дорабатывать проект?

Спустя 2 минуты, 18 секунд (25.11.2010 - 16:52) linker написал(а):
Тебя будут очень сильно ругать, причем возможно даже нехорошими словами smile.gif.

Спустя 4 минуты, 24 секунды (25.11.2010 - 16:56) maximka787 написал(а):
Цитата (linker @ 25.11.2010 - 13:52)
Тебя будут очень сильно ругать, причем возможно даже нехорошими словами smile.gif.

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

Спустя 1 минута, 16 секунд (25.11.2010 - 16:58) linker написал(а):
Ну смотри smile.gif


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.