Первым этапом создания любого программного продукта является постановка задачи. Имея точно сформулированные цели и задачи, можно приступать к проектированию структуры базы данных и всего приложения в целом. Разработку приложения можно начинать, только имея готовый проект, иначе вся работа грозит закончиться неудачей и потерей драгоценного времени.
Наш заказчик — директор небольшого магазина аудио- видео аппаратуры. Постоянные покупатели время от времени звонят в магазин, чтобы узнать о наличии того или иного конкретного товара. Нередко люди просят привезти им товар на дом или на работу, поэтому руководство магазина решило пойти им навстречу и создать специальную службу заказа и доставки товара покупателям. Из всех возможных вариантов сеть Интернет оказалась идеальным вариантом для реализации проекта, так как большая часть покупателей имела отношение к компьютерам и постоянно пользовалась услугами Сети, а анализ стоимости создания и эксплуатации службы заказа показал, что проект на основе сети Интернет потребует намного меньше капиталовложений, чем альтернативные варианты.
После долгой беседы с заказчиком был составлен необходимый минимум свойств и требований, предъявляемых к будущему приложению. Приложение должно:
· показывать потенциальному покупателю информацию о товаре;
· представлять описания и свойства товара в структурированных категориях;
· иметь возможность быстрого и относительно простого обновления внешнего вида сайта;
· использовать внутреннюю банерную систему, использующую несколько популярных форматов банеров, в том числе и из внешних источников (банерных сетей);
· позволять пользователю производить поиск товаров в названиях и описаниях товаров путем задания ключевых слов;
· автоматизировать систему приема заказов, отправлять уведомления о заказе покупателю и владельцу Интернет-магазина;
· обеспечить конфиденциальность информации о покупателях и заказах;
· управлять работой Интернет-магазина через web-браузер.
Доставку товара заказчик собирается производить с помощью одной из курьерских фирм города и только в пределах города, в котором располагается его магазин. Магазин и курьерская служба заключили предварительное соглашение о том, что стоимость доставки будет составлять 2% от суммы заказа или не менее $1, если сумма заказа меньше $1. Возможность торговли по всему миру требует больших дополнительных расходов на организацию бизнеса и нашего заказчика не интересует.
Заказчик поставил несколько дополнительных условий:
· очень важны минимальные вложения средств в этот проект;
· первоначально размещать проект предполагается в одной из популярных служб, оплатив недорогой виртуальный сервер на платформе Linux. При успешном развитии проекта, когда он начнет приносить прибыль, площадку необходимо будет сменить, и для того, чтобы не было проблем переноса с одного сервера на другой, приложение должно быть мобильным и, по мере возможности, платформо-независимым.
С учетом всех этих условий для организации Интернет-магазина был выбран популярный язык программирования PHP и база данных MySQL. Оба эти продукта поддерживают лицензию GNU, что снижает затраты на внедрение, кроме того, наличие исходных кодов этих продуктов позволяет не зависеть от конкретной фирмы-разработчика. Версии этих продуктов существуют для большинства операционных систем и поддерживаются практически всеми площадками, предоставляющими услуги по размещению сайтов.
Сайт вводится в действие поэтапно. Первоначально создается Интернет-каталог, после чего к нему добавляется функциональность Интернет-магазина. И, наконец, третьей ступенью является подключение к платежным системам.
Интернет-каталог включает в себя следующие возможности:
· предоставление потенциальному покупателю информации о товаре;
· представление описаний и свойств товара в структурированных категориях;
· возможность быстрого и относительно простого обновления внешнего вида сайта;
· использование внутренней банерной системы, поддерживающей несколько популярных форматов банеров, в том числе и из внешних источников (банерных сетей);
· предоставление пользователю возможности производить поиск товаров в тексте названий и описаний товаров путем задания ключевых слов;
· управление работой Интернет-магазина через web-браузер.
После завершения разработки Интернет-каталога и принятия его заказчиком необходимо добавить возможности Интернет-магазина, а именно:
· автоматизировать систему приема заказов, организовать отправление уведомления о заказе покупателю и владельцу Интернет-магазина;
· обеспечить конфиденциальность информации о покупателях и заказах;
· обеспечить возможность управления работой Интернет-магазина через web-браузер.
На последнем этапе, по желанию заказчика, созданный Интернет-магазин подключается к одной или нескольким платежным системам для оплаты товара по платежным картам. До этого момента заказы принимаются, но оплата их производится только наличными курьеру.
Приступая к разработке сайта, частью которого является Интернет-магазин, необходимо четко представлять структуру навигации и информационного наполнения. Это позволит определить структуру Интернет-приложения и используемые технологии. Как и для большинства приложений, необходимо составить соглашения о присвоении имен.
Для четкого представления структуры создаваемого Интернет-приложения строится навигационная карта с указанием всех возможных страниц, на основании которой в дальнейшем будет разрабатываться приложение.
Как уже отмечалось выше, сайт вводится в действие поэтапно. Первоначально создается Интернет-каталог, после чего к нему добавляется недостающая функциональность Интернет-магазина. Навигационная карта должна быть составлена для выполнения каждого из этапов разработки.
Навигационная карта Интернет-каталога представлена на рис. 5.1.
Главная страница |
Каталог товаров |
Страница с информацией о производителе |
Поиск товаров |
Страница с описанием товара |
С главной страницы Интернет-каталога пользователь переходит на страницы каталога, в котором представлен список товаров и их краткое описание, указаны ссылки на информацию о производителе, и описание товара.
Рис. 5.1. Навигационная карта Интернет-каталога
В результате поиска на экран выводится список товаров, удовлетворяющих параметрам поиска. Доступ к средствам поиска происходит с любой страницы Интернет-приложения.
Как уже говорилось ранее, Интернет-магазин состоит, как минимум, из трех частей:
· Интернет-каталог;
· виртуальная корзинка и механизм авторизации покупателей;
· справочная часть Интернет-магазина.
Карта Интернет-магазина практически ничем не отличается от карты Интернет-каталога, представленной на рис. 5.1. Единственное отличие состоит в оформлении товаров Интернет-магазина. Около каждого товара и на рекламных банерах товаров имеется кнопка, с помощью которой покупатель может добавить товар в свою виртуальную корзинку.
Виртуальная корзинка |
Регистрация или уточнение адреса доставки |
Выбор метода оплаты |
Оплата по платежной карточке |
Рис. 5.2. Виртуальная покупательская корзинка
Виртуальная покупательская корзинка содержит товары, добавленные покупателем, позволяет произвести пересчет или удаление товаров и перейти к окончательным фазам Интернет-продажи. На этом этапе производится регистрация покупателя и уточнение адреса доставки.
В данном проекте применяется упрощенная схема корзинки. Полная схема покупательской корзинки включает в себя возможность заказа товаров одним покупателем на различные адреса и хранение истории предыдущих покупок и адресов, по которым они были доставлены, виртуальный кошелек, набор скидок и другие интересные виды сервиса Интернет-торговли.
Упрощенная схема позволяет покупателю заказывать товары и выбирать адрес доставки (см. рис. 5.2). После подключения Интернет-магазина к одной из платежных систем покупатель сможет выбирать наиболее удобную для него систему оплаты и оплачивать товар с помощью платежных карт, не отходя от компьютера.
Обратная связь |
Информация о торгующей компании |
Рис. 5.3. Справочная часть Интернет-магазина
Пользовательская справка — неотъемлемая составляющая любого программного продукта, в том числе и Интернет-магазина. Здесь пользователь сможет получить информацию о компании, задать вопросы менеджерам, уточнить интересующие его вопросы по работе Интернет-магазина. Несмотря на не совсем техническую сторону этого вопроса (обычно это набор статических HTML-файлов), справочная часть Интернет-магазина очень важна и имеет непосредственное влияние на продажи.
Все вышесказанное касалось в основном пользовательской части, но менеджеру Интернет-магазина необходим инструмент управления:
· информацией, представленной на страницах каталога;
· заказами покупателей;
· работой пользователей.
Для хранения информации в базе данных необходимо предварительно определить группы и параметры данных, свести эту информацию в реляционные таблицы и установить между ними связи. Кроме того, необходимо задать первичные ключи и индексы, нормализовать структуру. Конечным результатом проектирования будет схема БД и типовой сценарий SQL на ее основе.
Первая составляющая нашего проекта — каталог. Как отмечалось ранее, каталог включает навигационную и информационную составляющие, следовательно, БД каталога состоит, как минимум, из двух таблиц — товаров и категорий, к которым относятся данные товары, а информация о производителе и описании товаров также используется при обработке данных о продукции. Чтобы исключить дублирование, создадим для данных о производителе и описании товаров отдельные таблицы.
Организация структуры и работы категорий может быть совершенно различной, но обычно используется рекурсивная схема, при которой одно из полей записи содержит ссылку на родительскую категорию (рис. 5.4).
Рекурсивная схема категорий характеризуется параметрами, описанными в табл. 5.1.
Таблица 5.1. Поля таблицы категорий (Categories)
Поле таблицы |
Тип данных |
Описание |
Id ParentCategory Name |
SMALLINT UNSIGNED SMALLINT UNSIGNED VARCHAR(32) |
Уникальный идентификатор категории Категория, по отношению к которой текущая является подкатегорией Название категории |
Для обеспечения возможности структурировать товар в категориях введено поле ParentCategory. Это поле — не что иное, как рекурсивный внешний ключ, указывающий на уникальный идентификатор Id, категории уровнем выше. Уникальный идентификатор Id однозначно определяет запись в таблице и является первичным ключом.
Компьютеры База Данных Приложения Игры Микросхемы Мультимедиа Операционные системы Программирование Сети Коммуникации Интернет Экономика Юридическая Психология Образование |
Рис. 5.4. Использование вложенности категорий
Рекурсивный внешний ключ в нашем случае позволяет создавать вложенность категорий. Для указания корневой директории вводится логическое ограничение: корневая категория имеет идентификатор с первичным ключом Id=0.
Тип данных для полей Id и ParentCategory выбран исходя из того, что категорий в несколько раз меньше, чем товаров, и для нашего небольшого магазина вполне достаточно зарезервировать 65 535 категорий/подкатегорий; для обоих полей используется тип SMALLINT UNSIGNED.
Поле Name имеет максимальную длину 32 символа, но этого достаточно, потому что название категории должно описываться одним, максимум двумя-тремя словами.
Как уже упоминалось выше, описать параметры товара можно в одной таблице, но можно вынести описание в несколько отдельных таблиц, это позволит повысить информативность Интернет-каталога и сведений о товарах, которые в нем представлены, а также упростит возможные изменения структуры базы данных в будущем. Таким образом, в нашем примере товары будут описаны тремя логически связанными таблицами:
· таблицей информации о товарах, в которой описаны основные параметры продукции (Productions);
· таблицей информации о производителе, в которой хранятся данные о производителе продукции, представленных в Интернет-магазине (Producer);
· таблицей описании продукции (Description).
Параметры таблицы товаров описаны в табл. 5.2.
Таблица 5.2. Поля таблицы продукции (Productions) |
||
Поле таблицы |
Тип данных |
Описание |
Id |
MEDIUMINT UNSIGNED |
Уникальный идентификатор товара |
Category |
SMALLINT UNSIGNED |
Категория, к которой относится данная продукция |
Name |
VARCHAR(255) |
Название продукции |
Producer |
SMALLINT UNSIGNED |
Производитель продукции |
Description |
SMALLINT UNSIGNED |
Описание продукции |
ImageHREF |
VARCHAR(255) |
Путь к файлу изображения продукции |
Synopsis |
TEXT |
Краткое описание |
Price |
DECIMAL(6, 2) |
Цена продукции |
Типы данных для полей определены в соответствии с особенностями реальных свойств товара и специфическими свойствами базы данных MySQL.
Так, для названия продукции (поле Name) определена максимальная длина 255 символов, и используется тип VARCHAR, а не CHAR, поскольку число букв в названии продукции может быть различным. Использование полей переменной длины позволяет избежать хранения ненужной информации.
Длина поля определяется максимально возможными или достаточными для большинства записей значениями. Так, для полей названия продукции (поле Name) и краткого описания (поле Synopsis) определена длина 255 символов, чтобы гарантировать правильное представление наименования и описания товара.
Файлы с изображениями разработчики MySQL рекомендуют хранить в виде внешних файлов на диске, а в базе данных MySQL указывать только пути к этим файлам — это существенно увеличивает скорость работы базы данных и приложения в целом, позволяет кэшировать изображения на стороне HTTP-сервера. Максимальная длина пути файла в большинстве операционных систем ограничивается 255 символами.
Цена продукции хранится в поле Price с типом DECIMAL(6,2), для данного проекта этого достаточно.
Поля Producer (информация о производителе) и Description (описание продукции) описаны как SMALLINT UNSIGNED, они являются ссылками на записи в таблицах Producer и Description, то есть внешними ключами.
Запись о продукцию однозначно идентифицируются с помощью уникального поля Id, которое является первичным ключом таблицы.
Основные выборки из таблицы Productions будут производиться по категориям (поле Category).
В соответствии с техническим заданием необходимо обеспечить поиск товара в названиях и описаниях товара (поля Name и Synopsis), для ускорения возможностей поиска необходимо определить индексы по этим полям.
В Интернет-магазине предусматривается возможность выборки информации по имени производителя, следовательно, необходимо добавить еще один индекс (поля Producer).
О производителе достаточно знать названия и краткую описание производителя.
Параметры таблицы производители (Producers) описаны в табл. 5.3.
Таблица 5.3. Поля таблицы производители (Producers)
Поле таблицы |
Тип данных |
Описание |
Id Name Description |
SMALLINT UNSIGNED VARCHAR(255) TEXT |
Уникальный идентификатор производителя Название производителя Краткое описание производителя |
Первичный ключ, однозначно определяющий запись в таблице, — поле Id. Основные запросы к таблице производители будут производиться по первичному ключу Id, поэтому другие индексы в данной таблице не потребуются.
В информацию о продукции включим название и краткую характеристику.
Параметры таблицы описания продукции описаны в табл. 5.4.
Таблица 5.4. Поля таблицы описания продукции (Description) |
||
Поле таблицы |
Тип данных |
Описание |
Id Name Description |
SMALLINT UNSIGNED VARCHAR(255) TEXT |
Уникальный идентификатор описания продукции Название продукции Краткое описание продукции |
Так же как и в таблице производителя, в этой таблице необходим только первичный ключ Id, однозначно определяющий запись в таблице.
Связи между таблицами Интернет-каталога
Описанных выше четырех таблиц достаточно, чтобы создать структурированный каталог и представить полную (или почти полную) информацию о продукции, находящихся в нем.
Для того чтобы более точно проследить логику спроектированной базы данных и связи между таблицами, рисуется модель логической структуры данных.
Фактически на данном этапе закончено проектирование структуры Интернет-каталога, на рис. 5.5 представлена его окончательная модель.
|
|
|
|
рис. 5.5. Модель логической структуры данных
Кроме хранения информации о каталоге продукции в Интернет-магазине требуется информация о пользователе и товарах, которые он заказал.
Информация о пользователе должна включать сведения, необходимые для доставки товара. Список необходимых параметров приведен в табл. 5.5.
Таблица 5.5. Поля таблицы пользователей (Users)
Поле таблицы |
Тип данных |
Описание |
Id |
MEDIUMINT UNSIGNED |
Уникальный идентификатор покупателя |
Name |
CHAR (127) |
Имя покупателя |
Surname |
CHAR (127) |
Фамилия покупателя |
|
VARCHAR(64) |
E-Mail покупателя |
Phone |
VARCHAR(20) |
Телефон для подтверждения заказа |
Address |
VARCHAR(255) |
Адрес доставки |
OrderID |
INT UNSIGNED |
Номер текущего заказа |
Для полей Name и Surname (имя и фамилия покупателя соответственно) определена максимальная длина поля 127 символов, этого должно быть достаточно для большинства потенциальных покупателей, излишнее увеличение связано с тем, что иногда пользователи вводят и имя, и фамилию в одном поле.
Поле Email определено длиной 64 символа. Возможно, это излишне, так как большинство адресов не превышают 15-30 символов, но представим, что кто-то с очень длинным адресом захочет купить товар в этом магазине. В случае с информацией о покупателях лучше перестраховаться и предусмотреть такую возможность.
Поле Phone (номер телефона для подтверждения заказа) используется для хранения как номера телефона, так и кода города/страны (например, 7-(812)-312-00-00), если пользователь ввел эту информацию.
В приложении будет использована упрощенная схема пользовательской корзинки. Информация о добавленном в корзинку товаре непосредственно помещается в таблицу. Для реализации упрощенной схемы пользовательской корзинки достаточно параметров, описанных в табл. 5.6.
Таблица 5.6. Поля таблицы пользовательской корзинки (Orders)
Поле таблицы |
Тип данных |
Описание |
Id |
INT UNSIGNED |
Номер заказа |
Amount |
TINYINT |
Число товаров, добавленных в покупательскую корзинку |
Production |
INT UNSIGNED |
Идентификатор добавленного товара |
В данной таблице первичный ключ не используется. Записи выбираются согласно номеру заказа Id, для которого необходимо определить индекс.
Окончательная модель логической структуры базы данных представлена на рис. 5.6.
|
|
|
|
|
|
Рис. 5.6. Модель логической структуры Интернет-магазина
После уточнения структуры базы данных можно приступать к созданию сценария SQL. Нужно заметить, что в нашем случае это не более чем типовой сценарий, описывающий структуру и связи базы данных, но в дальнейшем на его основе будут строиться сценарии автоматизации создания БД.
Листинг 5.1. Сценарий SQL для Интернет-магазина
DROP TABLE IF EXISTS Users;
DROP TABLE IF EXISTS Orders;
DROP TABLE IF EXISTS Productions;
DROP TABLE IF EXISTS Producers;
DROP TABLE IF EXISTS Categories;
DROP TABLE IF EXISTS Descriptions;
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
# Table: Descriptions #
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
CREATE TABLE Descriptions (
Id MEDIUMINT NOT NULL AUTO_INCREMENT,
Name VARCHAR(255) NOT NULL,
Description TEXT NOT NULL,
PRIMARY KEY (Id)
);
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
# Table: Producers #
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
CREATE TABLE Producers (
Id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
Name VARCHAR(255) NOT NULL,
Description TEXT NOT NULL,
PRIMARY KEY (Id)
);
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
# Table: Categories #
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
CREATE TABLE Categories (
Id MEDIUMINT NOT NULL AUTO_INCREMENT,
ParentCategory MEDIUMINT NOT NULL,
Name VARCHAR(255) NOT NULL,
PRIMARY KEY (Id),
INDEX (ParentCategory),
CONSTRAINT FK_CATEGORI_REFERENCE_CATEGORI FOREIGN KEY (ParentCategory)
REFERENCES Categories (Id)
);
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
# Table: Productions #
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
CREATE TABLE Productions (
Id MEDIUMINT NOT NULL AUTO_INCREMENT,
Category MEDIUMINT NOT NULL,
Name VARCHAR(255) NOT NULL,
Producer SMALLINT UNSIGNED NOT NULL,
Description SMALLINT UNSIGNED NOT NULL,
ImageHREF VARCHAR(255) NOT NULL,
Synopsis TEXT NOT NULL,
Price DECIMAL(6,2) NOT NULL,
PRIMARY KEY (Id),
INDEX (Category),
INDEX (Producer),
INDEX (Description),
FULLTEXT INDEX (Name, Synopsis),
CONSTRAINT FK_Productions_REFERENCE_Producers FOREIGN KEY (Producer)
REFERENCES Producers (Id),
CONSTRAINT FK_Productions_REFERENCE_Descriptions FOREIGN KEY (Description)
REFERENCES DescriptionS (Id),
CONSTRAINT FK_Productions_REFERENCE_CATEGORI FOREIGN KEY (Category)
REFERENCES Categories (Id)
);
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
# Table: Orders #
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
CREATE TABLE Orders (
Id INT NOT NULL,
Amount SMALLINT NOT NULL,
Production MEDIUMINT NOT NULL,
INDEX (Id),
INDEX (Production),
CONSTRAINT FK_Orders_REFERENCE_ Productions FOREIGN KEY (Production)
REFERENCES Productions (Id)
);
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
# Table: Users #
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #
CREATE TABLE Users (
Id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
Name VARCHAR(127) NOT NULL,
Surname VARCHAR(127) NOT NULL,
Email VARCHAR(64) NOT NULL,
Password VARCHAR(12) NOT NULL,
Phone VARCHAR(20) NOT NULL,
Address VARCHAR(255) NOT NULL,
OrderID INT UNSIGNED NOT NULL,
PRIMARY KEY (Id),
INDEX(Email, Password),
CONSTRAINT FK_Users_REFERENCE_Orders FOREIGN KEY (OrderID)
REFERENCES Orders (Id)
);