Движок Federated в MySQL – симлинк в базе данных

March 12th, 2010 1 Comment »

Знаете ли вы, что в MySQL, помимо MyISAM и InnoDB, есть движок под названием Federated?

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

Её можно использоваться для следующих целей:

  1. Каждый раз при собирании БД большого проекта приходится ждать по 15-20 минут, пока загрузится какая-то большая справочная таблица, например, города мира, список аэропортов мира или БД мест развлечений и отдыха. При использовании Federated вам нужно только задать CREATE TABLE — и данные будут сразу доступны из другой базы данных;
  2. Эти справочные таблицы могут использоваться несколькими окружениями вашего проекта — например, на тестовом сайте и на продакш-версии.

Чтобы узнать, поддерживает ли ваш сервер данный движок, воспользуйтесь простейшим PHPMyAdmin — нажмите ссылку Домой (с домиком), затем “Типы таблиц”.

Если он недоступен, то зайдите в ваш my.ini файл, найдите блок “[mysqld]” и вставьте строку “federated” сразу после:

[mysqld]
federated

P.S. Если вы ошиблись в структуре созданной таблицы, PHPMyAdmin покажет вашу БД как пустую 😉 Чтобы исправить это, дропните эту таблицу SQL-запросом — и пересоздайте правильно.

Базы данных в реальном мире

January 13th, 2010 No Comments »

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

Студент будучи хорошим учеником, спроектирует что-то вроде такой схемы:

products (id, name, price, quantity) -- для хранения товаров и остатков
users (id, name) -- для хранения пользователей
orders (id, date, sum) -- для хранения заказов

Потом студент свяжет эти таблицы, и будет прав, теория на его стороне:

users_orders (id_user, id_order)
orders_products (id_order, id_product)

Если студент был не просто хорош, а очень хорош, он навесит индексы, и foreign-keys.

Магазин начал работу, товары вносятся в базу, появились клиенты, пошл продажи. Все хорошо, убрали позиции старого ассортимента, добавили новые, пара клиентов забыли свои пароли и создали новые аккаунты. Тут начались чудеса – звонит клиент и просит найти старый заказ, а его нет. А если есть заказ, он оказывается пуст… В чем же ошибка ?

Ошибка в том что в эту сферически-вакуумную базу не были внесены некоторые неидеальности, чтобы учесть неидеальность реальности.

Заказ в интернет-магазине – это не просто список, это факт. Это – снимок реальности в каком то моменте времени. Поэтому таблица должна была выглядеть так:
orders_products (id_order, product_name, product_price, quantity, sum)

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

С foreign keys и каскадным удалением тоже шутить не надо – удаление плохого пользователя из таблицы users не должно удалять его заказы. Заказ – это факт свершенный, отрицать его или выкинуть ради красоты теории будет неверным.

Строим веб-приложение

January 23rd, 2009 1 Comment »

Эта заметка открывает цикл обучающих статей, по изучении которых ты, дорогой читатель, сможешь без посторонней помощи создать незамысловатое веб-приложение. Мы рука об руку пройдем следующий путь:

  1. рассмотрим, как устроена веб-страница
  2. установим веб-сервер
  3. напишем свою первую страницу на языке PHP
  4. добавим немного интерактива с помощью JavaScript, а также прикрутим AJAX
  5. разберемся, как работать с базой данных
  6. сделаем страницу, доступную только тем, кто знает пароль
  7. выложим это всё куда-нибудь в интернет

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

Итак, какие идеи?

Устанавливаем MS SQL Server 2005 Express Edition

November 23rd, 2007 1 Comment »

Может показатся, что другого бесплатного сервера БД кроме MySQL на текущий момент не существует – слишком уж он распространен. Однако это не совсем верно. Даже не говоря о таких замечательных open source СУБД как Postgre, на текущий момент разработчик может сводобно получить и использовать такие “большие” системы как MS SQL Server, IBM DB2 и даже Oracle.

Самый легкий для понимания и установки, а также довольно распространенный в наших широтах, MS SQL Server 2005 Express Edition доступен на сайте Microsoft для свободного скачивания и использования. Чтобы познакомится поближе с этим зверем делаем так:

  1. Скачиваем MS SQL Server 2005 Express Edition Download
  2. Скачиваем архиполезную тулзу MS SQL Server Management Studio Express
  3. Скачиваем сопутствующие вещи (ссылки см. там же) – например .NET Framework 2.0
  4. Устанавливаем это хозяство на своей машине

Очень сложно, верно ? Отож.

С помощью Server Management Studio можно создавать и удалять базы и таблицы, просматривать данные в таблицах MSSQL, делать запросы, создавать процедуры и триггеры, управлять аккаунтами пользователя. С помощью Server Configuration Manager настраиваются сетевые соединения и прочее.

После того как базовые функции освоены, можно попробовать использовать MSSQL в связке с PHP, Coldfusion, ASP.net или чем угодно для создания веб-сайтов или desktop-приложений. Как это делать – зависит от конктретного языка, в любом случае это не сложнее чем с MySQL. Есть правда несколько ловушек куда можно угодить, делая первые шаги:

  • Супер-пользователь в SQL Server зовется не “root” а “sa”
  • Протокол TCP/IP по умолчанию отключен, посему соединится с сервером из скрипта может не получится. Чтобы активировать протокол нужно воспользоваться тулзой MS SQL Server Configuration Manager: в разделе Protocols найти TCP/IP и его свойствах на вкладке протокол поставить Yes рядом с позицией Enabled.
    SQL Server Configuration Manager
  • В отличие от прошлых версий и от MySQL, в MS SQL Server 2005 Express Edition порт не установлен жестко в конкретное значение. Поэтому если вы зовете MSSQL по стандартном порту 1433 – он вас не услышит. Узнать какой порт используется в конкретном случае можно той же тулзой MS SQL Server Configuration Manager, поле TCP Dynamic Ports на закладке IP Addresses в Свойствах (Properties) протокола TCP/IP.
  • По умолчанию, в SQL Server отключена “родная” аутентификация, и включена только Windows Authentification. Проще говоря, просто по логин-паролю в сервер не зайдешь. Чтобы включить SQL Server Authentication, зайдите тулзой MS SQL Server Management Studio Express используя Windows-аутентификацию, клацнув правой клавишей на сервере вызовите его Свойства (Properties), в закладке Security позиция Server Authentification – выставить радиобатон в позицию “SQL Server and Windows Authentication mode”
  • Лучший способ принести или унести БД целиком – сделать Detach базы данных в одном месте, и сделать Attach на другом сервере – дешево и сердито. База данных в сервере MS SQL – это один файл с расширением .mdf + файл лога .ldf (но он не требуется при переносе)
  • Если вы создали таблицу под одним пользователем (например находясь в Management Studio Express под пользователем sa), а пытаетесь работать с таблицей из PHP под другим пользователем, то таблицу вы скорее всего не увидите, поскольку они созданы в разных схемах. Под sa эта схема скорее всего называется ‘dbo’, а у пользователя – совпадает с его логином. Так что dbo.Accounts и vasya.Accounts – это две разные таблицы. Чтобы перекинуть таблицы из одной схемы в другую можно сделать одну хитрость. Запустить скрипт приведенный ниже:

    SELECT 'ALTER SCHEMA dbo TRANSFER ' + TABLE_SCHEMA + '.' + TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'vasya'
    

    Затем скопипастить получившиеся строки в окно запроса и выполнить их все. Таблицы перейдут из схемы vasya в схему dbo.

Microsoft прилагает массу усилий в конкурентной борьбе за долю MS SQL Server на рынке. Интернет щедро заполнен публикациями о том как делать те или иные вещи с помощью MS SQL, а сам сервер и сопутствующее ПО достаточно дружественны к неопытному пользователю.

Ссылки по теме:
IBM DB2 Trial Downloads
Oracle Database 10g Express Edition