Проектирование Интернет-приложений

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

5.1 Постановка задачи

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

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

·        показывать потенциальному покупателю информацию о товаре;

·        представлять описания и свойства товара в структурированных категориях;

·        иметь возможность быстрого и относительно простого обновления внешнего вида сайта;

·        использовать внутреннюю банерную систему, использующую несколько по­пулярных форматов банеров, в том числе и из внешних источников (банерных сетей);

·        позволять пользователю производить поиск товаров в названиях и описаниях товаров путем задания ключевых слов;

·        автоматизировать систему приема заказов, отправлять уведомления о заказе покупателю и владельцу Интернет-магазина;

·        обеспечить конфиденциальность информации о покупателях и заказах;

·        управлять работой Интернет-магазина через web-браузер.

Доставку товара заказчик собирается производить с помощью одной из курьер­ских фирм города и только в пределах города, в котором располагается его мага­зин. Магазин и курьерская служба заключили предварительное согла­шение о том, что стоимость доставки будет составлять 2% от суммы заказа или не менее $1, если сумма заказа меньше $1. Возможность торговли по всему миру требует больших дополнительных расходов на организацию бизнеса и нашего заказчика не интересует.

Заказчик поставил несколько дополнительных условий:

·        очень важны минимальные вложения средств в этот проект;

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

С учетом всех этих условий для организации Интернет-магазина был выбран по­пулярный язык программирования PHP и база данных MySQL. Оба эти продук­та поддерживают лицензию GNU, что снижает затраты на внедрение, кроме того, наличие исходных кодов этих продуктов позволяет не зависеть от конкретной фирмы-разработчика. Версии этих продуктов существуют для большинства опе­рационных систем и поддерживаются практически всеми площадками, предос­тавляющими услуги по размещению сайтов.

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

Интернет-каталог включает в себя следующие возможности:

·        предоставление потенциальному покупателю информации о товаре;

·        представление описаний и свойств товара в структурированных категориях;

·        возможность быстрого и относительно простого обновления внешнего вида сайта;

·        использование внутренней банерной системы, поддерживающей несколько популярных форматов банеров, в том числе и из внешних источников (банерных сетей);

·        предоставление пользователю возможности производить поиск товаров в тек­сте названий и описаний товаров путем задания ключевых слов;

·        управление работой Интернет-магазина через web-браузер.

После завершения разработки Интернет-каталога и принятия его заказчиком не­обходимо добавить возможности Интернет-магазина, а именно:

·        автоматизировать систему приема заказов, организовать отправление уведом­ления о заказе покупателю и владельцу Интернет-магазина;

·        обеспечить конфиденциальность информации о покупателях и заказах;

·        обеспечить возможность управления работой Интернет-магазина через web-браузер.

На последнем этапе, по желанию заказчика, созданный Интернет-магазин под­ключается к одной или нескольким платежным системам для оплаты товара по платежным картам. До этого момента заказы принимаются, но оплата их произ­водится только наличными курьеру.

5.2 Проектирование Интернет-магазина

Приступая к разработке сайта, частью которого является Интернет-магазин, необходимо четко представлять структуру навигации и ин­формационного наполнения. Это позволит определить структуру Интернет-при­ложения и используемые технологии. Как и для большинства приложений, не­обходимо составить соглашения о присвоении имен.

Карта Интернет-магазина

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

Как уже отмечалось выше, сайт вводится в действие поэтапно. Первоначально создается Интернет-каталог, после чего к нему добавляется недостающая функ­циональность Интернет-магазина. Навигационная карта должна быть составле­на для выполнения каждого из этапов разработки.

Навигационная карта Интернет-каталога представлена на рис. 5.1.

Главная страница

Каталог товаров

Страница с информацией о производителе

Поиск товаров

Страница с описанием товара


С главной страницы Интернет-каталога пользователь переходит на страницы каталога, в котором представлен список товаров и их краткое описание, указаны ссылки на информацию  о производителе, и описание товара.

 

 

 

 

 

 

 

                                    Рис. 5.1. Навигационная карта Интернет-каталога

 

В результате поиска на экран выводится список товаров, удовлетворяющих пара­метрам поиска. Доступ к средствам поиска происходит с любой страницы Ин­тернет-приложения.

Как уже говорилось ранее, Интернет-магазин состоит, как минимум, из трех час­тей:

·        Интернет-каталог;

·        виртуальная корзинка и механизм авторизации покупателей;

·        справочная часть Интернет-магазина.

Карта Интернет-магазина практически ничем не отличается от карты Интернет-каталога, представленной на рис. 5.1. Единственное отличие состоит в оформле­нии товаров Интернет-магазина. Около каждого товара и на рекламных банерах товаров имеется кнопка, с помощью которой покупатель может добавить товар в свою виртуальную корзинку.

 

Виртуальная корзинка

Регистрация или уточнение адреса доставки

Выбор метода оплаты

Оплата по платежной карточке

Рис. 5.2. Виртуальная покупательская корзинка

Виртуальная покупательская корзинка содержит товары, добавленные покупате­лем, позволяет произвести пересчет или удаление товаров и перейти к оконча­тельным фазам Интернет-продажи. На этом этапе производится регистрация по­купателя и уточнение адреса доставки.

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

Упрощенная схема позволяет покупателю заказывать товары и выбирать адрес доставки (см. рис. 5.2). После подключения Интернет-магазина к одной из пла­тежных систем покупатель сможет выбирать наиболее удобную для него систему оплаты и оплачивать товар с помощью платежных карт, не отходя от компью­тера.

Text Box: Описание возможностей Интернет-магазина

 

 

Обратная связь

Информация о торгующей компании

Рис. 5.3. Справочная часть Интернет-магазина

Пользовательская справка — неотъемлемая составляющая любого программного продукта, в том числе и Интернет-магазина. Здесь пользователь сможет получить информацию о компании, задать вопросы менеджерам, уточнить интересующие его вопросы по работе Интернет-магазина. Несмотря на не совсем техническую сторону этого вопроса (обычно это набор статических HTML-файлов), справоч­ная часть Интернет-магазина очень важна и имеет непосредственное влияние на продажи.

Все вышесказанное касалось в основном пользовательской части, но менеджеру Интернет-магазина необходим инструмент управления:

·        информацией, представленной на страницах каталога;

·        заказами покупателей;

·        работой пользователей.

5.3 Проектирование БД

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

Productions

PK

Id

FK1,I1

I2

FK2,I3

FK3,I4

 

I2

Category

Name

Producer

Description

ImageHREF

Synopsis

Price

 

 

Categories

PK

Id

FK1,I1

ParentCategory

Name

Synopsis

 

Producers

PK

Id

 

Name

Description

 

 

Description

PK

Id

 

Name

Description

 

 

рис. 5.5. Модель логической структуры данных

 

Данные Интернет-магазина

Кроме хранения информации о каталоге продукции в Интернет-магазине требуется информация о пользователе и товарах, которые он заказал.

Информация о пользователе должна включать сведения, необходимые для дос­тавки товара. Список необходимых параметров приведен в табл. 5.5.

Таблица 5.5. Поля таблицы пользователей (Users)

Поле таблицы

Тип данных

Описание

Id

MEDIUMINT UNSIGNED

Уникальный идентификатор покупателя

Name

CHAR (127)

Имя покупателя

Surname

CHAR (127)

Фамилия покупателя

Email

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.

Productions

PK

Id

FK1,I1

I2

FK2,I3

FK3,I4

 

I2

Category

Name

Producer

Description

ImageHREF

Synopsis

Price

 

 

Categories

PK

Id

FK1,I1

ParentCategory

Name

Synopsis

 

Producers

PK

Id

 

Name

Description

 

 

Description

PK

Id

 

Name

Description

 

 

Orders

I1

Id

 

FK1,I2

Amount

Production

 

 

Users

PK,I1

Id

 

 

I2

 

 

FK1,I3

Name

Surname

Email

Phone

Address

OrderId

 

 

Рис. 5.6. Модель логической структуры Интернет-магазина

Сценарий SQL

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

);