Вопрос по работе с базой данных в Yii

Столкнулся вот с каким вопросом.

Связанные таблицы типа Post-PostTag-Tag я научился делать, причем yiic их воспринимает без проблем и прописывает связи между таблицами.

Есть ли возможность сделать связь типа Pstest-PstestQuestion-Question-QuiestionAnswer-Answer и работать с ней в одном контроллере PstestController?

Вот дамп базы данных:




CREATE TABLE `Pstest` (

  `id` int(11) unsigned NOT NULL auto_increment,

  `userUid` int(11) unsigned NOT NULL COMMENT 'CONSTRAINT FOREIGN KEY (userUid) REFERENCES User(uid)',

  `title` varchar(128) NOT NULL,

  `description` text NOT NULL,

  `tags` text,

  `status` int(11) unsigned NOT NULL,

  `createTime` int(11) unsigned default NULL,

  `updateTime` int(11) unsigned default NULL,

  `questions` text,

  `results` text,

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `User` (

  `uid` int(11) unsigned NOT NULL auto_increment,

  `name` varchar(128) NOT NULL,

  `password` varchar(128) NOT NULL,

  `email` varchar(128) NOT NULL,

  PRIMARY KEY  (`uid`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `Answer` (

  `id` int(11) unsigned NOT NULL auto_increment,

  `Answer` text NOT NULL,

  `Point` int(11) unsigned NOT NULL,

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `Question` (

  `id` int(11) unsigned NOT NULL auto_increment,

  `question` text NOT NULL,

  `multichoice` int(11) unsigned NOT NULL,

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `Result` (

  `id` int(11) unsigned NOT NULL auto_increment,

  `result` text NOT NULL,

  `min` int(11) unsigned NOT NULL,

  `max` int(11) unsigned NOT NULL,

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `Tag` (

  `id` int(11) unsigned NOT NULL auto_increment,

  `name` varchar(128) NOT NULL,

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `PstestQuestion` (

  `pstestId` int(11) unsigned NOT NULL COMMENT 'CONSTRAINT FOREIGN KEY (pstestId) REFERENCES Pstest(id)',

  `questionId` int(11) unsigned NOT NULL COMMENT 'CONSTRAINT FOREIGN KEY (questionId) REFERENCES Question(id)',

  PRIMARY KEY  (`pstestId`,`questionId`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `PstestResult` (

  `pstestId` int(11) unsigned NOT NULL COMMENT 'CONSTRAINT FOREIGN KEY (pstestId) REFERENCES Pstest(id)',

  `resultId` int(11) unsigned NOT NULL COMMENT 'CONSTRAINT FOREIGN KEY (resultId) REFERENCES Result(id)',

  PRIMARY KEY  (`resultId`,`pstestId`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `PstestTag` (

  `pstestId` int(11) unsigned NOT NULL COMMENT 'CONSTRAINT FOREIGN KEY (pstestId) REFERENCES Pstest(id)',

  `tagId` int(11) unsigned NOT NULL COMMENT 'CONSTRAINT FOREIGN KEY (tagId) REFERENCES Tag(id)',

  PRIMARY KEY  (`pstestId`,`tagId`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `QuestionAnswer` (

  `questionId` int(11) unsigned NOT NULL COMMENT 'CONSTRAINT FOREIGN KEY (questionId) REFERENCES Question(id)',

  `answerId` int(11) unsigned NOT NULL COMMENT 'CONSTRAINT FOREIGN KEY (answerId) REFERENCES Answer(id)',

  PRIMARY KEY  (`answerId`,`questionId`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;



Метод создания базы данных вида, который хорошо определяется yiic брал здесь здесь. График сделаю немного позже, но, надеюсь, что и так подскажете.

Заранее благодарен всем откликнувшимся.

Если же вы знаете, на каком фреймворке это проще сделать, то напишите, пожалуйста.

А что вы хотите получить от такой связи ???

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

Я уже думал, что проще будет организовать контроль за идентификаторами тестов, вопросов и ответов в контроллере.

Moodle мне предлагать не надо, он сильно монструозен, хотя и немного ограничен, если смотреть на мои задачи. Да и написать такую систему я хочу самостоятельно. Это мое первое знакомство с фреймворками.

Смотрел на Zend Framework, CodeIgniter и CakePHP. Zend сильно сложен и монструозен (хотя в нем много интересных класов и возможностей). По отзывам программистов на других форумах он еще достаточно тормознут и, как там выразились, "глюковат". А CodeIgniter и "Пироженное" - прошедший век. PHP4 уже неоправдано изучать в наше время, уже PHP6 активно разрабатывается. Слышал, что еще есть Symphony, Kohana и, собственно говоря, тот фреймворк, которому посвящен этот форум, - Yii. Вот и интересуюсь, какому фреймворку выделить место первого фреймворка, который я изучу, и какой из PHP5 фреймворков проще.

По поводу Symfony. Слышал, что Propel и Doctrine позволяют организовать сложную структуру таблиц базы данных, но они достаточно сложны в изучении и медленноработающие. Для их полнофункционального использования необходимо изучать язык YAML.

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

Заранее благодарен.

Я даже и не пыталлся Вам что то предложить … тем более раз Вы тут среди нас :)

Я бы предложить все таки разумно делить сущности.

Я пока честно говоря не нашел необходимости зачем работать только с одним контроллером ? и только с одной моделью …

Честно мой Вам совет подумайте над структурой БД, и делите, делите, делите…

Чем проще тем лучше причем не только для Вас, как программиста, но и для пользователя.

Если Вы расскажите в какой ситуации Вам может понадобится одновременно информация о тесте, вопросах и ответах сразу …было бы интересно.

Если же такой ситуации у Вас нету, крайне советую на каждую сущность делать свою модель.

На вкус и цвет как говориться…

Работал со всем вами перечисленным кроме симфони. Советую пощупать всё более подробно, а потом уже выбирать что начать учить до конца.

Большое спасибо всем откликнувшимся. Думаю, что это не последний мой с Вами разговор :-), так как после поверхностного прощупывания по рекомендации Zoltera решил остановится на Yii. На мой взгляд в нем наиболее прозрачная архитектура при хорошей скорости работы.

Zend тоже хорош, но сильно запутан и очень много весит.

Спасибо.

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

Вопрос ради интереса, а один и тот же вопрос может относится к нескольким тестам, и один ответ может относится к нескольким вопросам?

Если нет, то зачем вам таблицы связи много ко многим?

А это, кстати, хорошее замечание. Я сразу и не подумал об этом. Вероятность повтора вопросов есть, но она настолько мала, что ей можно пренебречь.

Спасибо. Буду пробовать.

Боюсь вы глубоко заблуждаетесь!

И дело тут не в программинге.

Пригласите в начале специалиста по юзабилити, и он Вас в пух и прах разнесет с таким подходом к построению интерфейса.

Даже тест с тремя вопросами нужно редактировать иначе!! а не вываливать все вопросы в кучу + к этому и базе и юзеру будет легче.

Насчет того, что базе и серверу будет легче, я соглашусь. Но вот с юзером не согласен. Вводить каждый вопрос на отдельной странице не удобно. Не видишь общую картину. А при создании collapsible fieldset на AJAX можно добиться нормального юзабилити и избавится от колбасы. Вопрос с дополнительными полями также обходится с помощью AJAX’а. Доступ к админке будет иметь только один человек, у которого в системе установлено все необходимое для работы с JavaScript и AJAX.

Да. И специалист, который будет работать с системой, именно так и захотел, чтобы все вопросы на одной странице были. Не будь у меня четкого ТЗ от пользователя будущей системы, я бы делал так, чтобы уменьшить нагрузку на сервер.

За помощь спасибо. Все необходимое с базы данных получил.

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

247

Yii.zip