pic
Здравствуйте, уважаемые читатели. Сегодня я хочу рассказать о таком важном навыке, как умение говорить "Нет". Вокруг нас происходит очень много событий и дел, какие-то приходится выполнять лично Вам, какие-то Вашим друзьям, коллегам и знакомым. Есть старая поговорка: "Друг познается в беде". С точки зрения здравой логики смысл этой поговорки можно толковать как - настоящий друг всегда поможет и в беде не оставит. В целом, логично и понятно, но есть одно "Но". Почему-то чаще всего именно те, кого...
pic
Многие люди так увлекаются работой, что оторваться от компьютера на 5-10 минут для них составляет большую трудность, поэтому чтобы хоть как-то заставить глаза отдыхать были придуманы программы, которые блокируют рабочий стол пользователя на 5-10 минут и делают перерыв в работе просто необходимостью. По сути, большинство программ работают по одному и тому же принципу, поэтому я лишь хочу привести несколько примеров таких программ. EyesRelax - блокирует компьютер каждые 30 минут на 5 м...
pic
Здравствуйте, уважаемые читатели. Я уже много писал о том, как заставить себя работать, максимально плотно спланировать свое время и двигаться к своей цели, но совсем забыл про то, что нужно отдыхать. Отдых - неотъемлемая часть нашей жизни. Без него люди превращаются просто в рабов, ну или в загнанных лошадей, а их, как известно, долго не держат. Все очень просто - нужно отдыхать. Возможно, для кого-то хороший отдых это прогулка, для кого-то - просмотр очередной серии Доктора Хауса. И то,...
pic
Здравствуйте, уважаемые читатели. Сегодня мы рассмотрим, как можно использовать Календарь Google для планирования и оптимизации своих задач. Первое, что стоит отметить при работе с Календарем Google - это уникальный сервис совместной работы. Он включает в себя как систему планирования, так и возможности напоминаний и совместной работы. Во-вторых, сервис находится в Интернете, что позволяет получить к нему доступ из любой точки Земли, где есть доступ к Глобальной сети. Итак, приступи...
pic
В предыдущих статьях мы определили свои глобальные цели (если Вы этого еще не сделали, то рекомендую сделать это немедленно и прочитать статью Как достигать больших целей) и декомпозировали их на более достижимые. В результате у нас получились следующие документы: список глобальных целей и иерархический список задач, которые нужно выполнить для достижения каждой конкретной цели. Теперь мы приступаем к достижению целей. Чаще всего целей не одна и даже не две, а гораздо больше. Как не разор...
Июл

21

Про сам фреймворк CakePHP я уже писал неоднократно. Для тех, кто хочет создать первое впечатление о фреймворке рекомендую прочитать статью Разработка веб-приложений с CakePHP. В статье я рассказывал, что из себя представляет данный фреймворк и какие основные принципы заложены в его основу.

Создаем модели правильно

Как я рассказывал в статье, CakePHP строится на модели MCV – модель-контроллер-отображение. Основой Вашего будущего представления будут именно модели, так как они обеспечивают взаимодействие приложение с базой данных. В качестве СУБД CakePHP может использовать большое количество баз данных, а также есть поддержка ODBC, что позволяет его подключать вообще ко всему-всему. Однако, каким бы универсальным решение не казалось, здесь есть свои ограничения.

Приведу небольшой пример. Работая над одним из последних своих проектов, мне нужно было извлекать данные из таблицы, которая была связана с еще 16. Таблицы базы данных я создал сразу при помощи утилиты phpMyAdmin, назначил внешние ключи. Модели также автоматически сгенерировал при помощи CakeBake.

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

Этот момент стал для меня переломным и к моделированию базы данных я решил подойти немного с другой стороны.

Создание таблиц в phpMyAdmin удобно, но данный продукт не позволяет полностью воспользоваться всеми возможностями, которые есть в MySQL 5 версии, например, создать ограничения по внешним ключам.

Определимся, что такое внешний ключ. Когда мы связываем две таблицы, в каждой из таблиц есть свой первичный ключ, для CakePHP обычно это ID, в то время, как внешний ключ будет формироваться как имяТаблицы_ID.

СУБД MySQL позволяет поддерживать ссылочную целостность, т.е. следит, чтобы в таблицах базы данных не хранилось записей, не связанных с другими записями, если для них есть внешние ключи.

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

Теперь проиллюстрирую все это при помощи удобной утилиты Mysql WorkBench, которую можно сказать с ее официального сайта. Создадим новую диаграмму, а в ней две таблицы. Я сделал это следующим образом:

Две самостоятельные таблицыНа диаграмме мы видим две самостоятельные таблицы, а точнее, сущности пока, которые не связны между собой. Очевидно, что Статьи и Комментарии находятся в отношении Один-ко-многим: одной статье соответствует много комментариев. Создадим эту связь при помощи соответствующей кнопки:

Кнопки создания связейТеперь у сущности Комментарий появился внешний ключ, а сами сущности теперь соединены пунктирной линией, а на закладке Foreign Keys появился новый внешний ключ.

Связь один-ко-многимОбратим внимание на правый нижний угол изображения, в нем находятся Foreign Key Options. Это и есть ограничения целостности, они как раз и отражают, как будет вести себя подчиненная таблица в случае изменения родительской, т.е. что нужно будет делать с записями в таблице Комментариев в случае изменения или удаления записи в таблице Статей.

За обновление и удаление отвечают ограничения On Update и On Delete. Они могут принимать следующие значения:

  • NO ACTION – не предпринимать никаких действий, выбирается по умолчанию. Вне зависимости от манипуляций с основной таблицей, записи в дочерней будут сохраняться.
  • SET NULL – в качестве значения внешнего ключа будет устанавливаться значение NULL, т.е. связанные записи будут попросту отваливаться от основной, т.е. ссылочная целостность будет нарушаться.
  • CASCADE – каскадное удаление или обновление. В случае удаления записи из родительской таблицы, будут сразу удалены все записи из дочерних таблиц, т.е. при удалении Статьи будут также удалены все связанные с ней комментарии. Каскадное обновление значит, что при обновлении значения первичного ключа у основной записи, будут автоматически обновлены значения внешних ключей для связанных таблиц.

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

Похожие материалы:

Поделись с друзьями:
Опубликовать в twitter.com Опубликовать в своем блоге livejournal.com Читать в Яндекс.Подписках
Присоединяйся ко мне:
3 комментариев

[...] предыдущей статье (Создаем модели правильно – Часть 1) я рассматривал необходимость ограничений [...]

Маркуш, 2:06 8 Август 2010

Ну что ж Александр… Вот тут ты меня окончательно загнал в ступор. Смотрю я на базу своего крайнего проекта и думаю: через сколько загнется сервак если дать на него 1000 запросов одновременно…
Маркуш недавно добавил Макс Засов is now friends with DJ Hobot

Александр Бармин, 11:13 8 Август 2010

Маркуш, не волнуйся. Для этого есть простой и быстрый выход – кэширование. Каждому из 1000 твоих пользователей надо будет отдать одну и ту же страницу, значит каждый раз ее заново генерировать смысла нет – можно сгенерировать один раз и остальным отдавать из кэша. Про кэширование вывода статья будет в среду – она уже готова и ждет публикации.

Написать комментарий

У меня включен CommentLuv

Друзья и коллеги

Запросы: 49 sql Время: 1.163 ms