Проектирование Интернет-приложений
https://exercises-on-sql.blogspot.com/2019/01/blog-post_19.html
1.2 Карта Интернет-магазина
2.2 Определение таблиц
4. Проектирование банерной системы
5. Универсальные приложения Интернет-торговли
6. Резюме
После долгой беседы с заказчиком был составлен необходимый минимум свойств и требований, предъявляемых к будущему приложению. Приложение должно:
- показывать потенциальному покупателю информацию о товаре (книгах);
- представлять описания и свойства товара в структурированных категориях;
- иметь возможность быстрого и относительно простого обновления внешнего вида сайта;
- использовать внутреннюю банерную систему, использующую несколько популярных форматов банеров, в том числе и из внешних источников (банерных сетей);
- позволять пользователю производить поиск товаров в названиях и описаниях товаров путем задания ключевых слов;
- автоматизировать систему приема заказов, отправлять уведомления о заказе покупателю и владельцу Интернет-магазина;
- обеспечить конфиденциальность информации о покупателях и заказах;
- управлять работой Интернет-магазина через web-браузер.
Заказчик поставил несколько дополнительных условий:
- очень важны минимальные вложения средств в этот проект;
- первоначально размещать проект предполагается в одной из популярных служб, оплатив недорогой виртуальный сервер на платформе Linux. При успешном развитии проекта, когда он начнет приносить прибыль, площадку необходимо будет сменить, и для того, чтобы не было проблем переноса с одного сервера на другой, приложение должно быть мобильным и, по мере возможности, платформо-независимым.
Сайт вводится в действие поэтапно. Первоначально создается Интернет-каталог, после чего к нему добавляется функциональность Интернет-магазина. И, наконец, третьей ступенью является подключение к платежным системам.
Интернет-каталог включает в себя следующие возможности:
- предоставление потенциальному покупателю информации о товаре (книгах);
- представление описаний и свойств товара в структурированных категориях;
- возможность быстрого и относительно простого обновления внешнего вида сайта;
- использование внутренней банерной системы, поддерживающей несколько популярных форматов банеров, в том числе и из внешних источников (банерных сетей);
- предоставление пользователю возможности производить поиск товаров в тексте названий и описаний товаров путем задания ключевых слов;
- управление работой Интернет-магазина через web-браузер.
- автоматизировать систему приема заказов, организовать отправление уведомления о заказе покупателю и владельцу Интернет-магазина;
- обеспечить конфиденциальность информации о покупателях и заказах;
- обеспечить возможность управления работой Интернет-магазина через web-браузер.
Как уже отмечалось выше, сайт вводится в действие поэтапно. Первоначально создается Интернет-каталог, после чего к нему добавляется недостающая функциональность Интернет-магазина. Навигационная карта должна быть составлена для выполнения каждого из этапов разработки.
Навигационная карта Интернет-каталога книжного магазина представлена на рис. 1.1.
С главной страницы Интернет-каталога пользователь переходит на страницы каталога, в котором представлен список книг и их краткое описание, указаны ссылки на информацию об авторе, написавшем книгу, и издательстве, ее выпустившем. Информация об авторе состоит из краткой биографической справки и списка книг этого автора, представленных в Интернет-каталоге. Аналогично, страница с информацией об издательстве содержит описание издательства и список книг, выпущенных им и продаваемых в Интернет-каталоге.

Рис. 1.1. Навигационная карта Интернет-каталога
Как уже говорилось ранее, Интернет-магазин состоит, как минимум, из трех частей:
- Интернет-каталог;
- виртуальная корзинка и механизм авторизации покупателей;
- справочная часть Интернет-магазина.

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

Рис. 1.3. Справочная часть Интернет-магазина
Все вышесказанное касалось в основном пользовательской части, но менеджеру Интернет-магазина необходим инструмент управления:
- информацией, представленной на страницах каталога;
- заказами покупателей;
- работой пользователей.
Если приложение больше, чем "Hello World", то, как правило, оно состоит из групп функций, каждая из которых является частью общей функциональности. Группы функций, выполняющие определенную работу, целесообразно выносить в отдельные файлы, таким образом разделяя приложение на модули.
Использование отдельных файлов для хранения исходного кода позволяет:
- работать над разными частями приложения независимо от других членов команды;
- разделять ресурсы проекта и повторно использовать их в других проектах;
- создавать различные модификации готовых модулей для использования в приложениях, без переработки всего приложения в целом;
- использовать исходные файлы меньшего размера, более удобные в редактировании.
- главная страница;
- навигационная система каталога;
- информация о книгах;
- информация об авторах;
- информация об издательствах;
- поиск информации;
- рекламная банерная система.
- виртуальную корзинку;
- механизм авторизации покупателей.
| Наименование модуля | Конфигурационный файл | Описание |
|---|---|---|
| book_navigation.pl | book_navigation.conf | Навигационная система Интернет-магазина |
| book_items.pl | book_items.conf | Модуль, обеспечивающий информацию о книгах, авторах книг и издательствах, представленных в каталоге Интернет-магазина |
| book_search.pl | book_search.conf | Поисковая система Интернет-каталога |
| banners.pl | banners.conf | Модуль, отвечающий за представление банерной рекламы на страницах Интернет-магазина |
| book_basket.pl | book_basket.conf | Функции добавления товара в покупательскую корзинку, пересчет, удаление, а также выбор адреса доставки и оплаты |
| book_auth.pl | book_auth.conf | Функции регистрации, доступа пользователя, а также функции, ответственные за идентификацию сеанса |
| book.cgi | book.conf | Основной сценарий приложения, ответственный за вызов необходимых покупателю функций |
| book_manager.cgi | book_manager.conf | Управляющая часть приложения |
Для удобства настройки Интернет-приложения на работу с различными базами данных настройки базы данных выносятся в отдельный конфигурационный файл.
В результате формируется, как минимум, три конфигурационных файла (табл. 1.2):
| Наименование модуля | Описание |
|---|---|
| book.conf | Общие настройки сценария |
| book_db.conf | Настройки базы данных |
| book_mould.conf | Настройки шаблонов |

Рис. 1.4. Связи между модулями Интернет-магазина
| Наименование модуля | Описание |
|---|---|
| book_func.pl | Функции общего назначения |
Категории каталога
Рекурсивная схема категорий характеризуется параметрами, описанными в табл. 1.4.
| Поле таблицы | Тип данных | Описание |
|---|---|---|
| Id | SMALLINT UNSIGNED | Уникальный идентификатор категории |
| ParentCategory | SMALLINT UNSIGNED | Категория, по отношению к которой текущая является подкатегорией |
| Name | VARCHAR(32) | Название категории |

Рис. 1.5. Использование вложенности категорий
Тип данных для полей Id и ParentCategory выбран исходя из того, что категорий в несколько раз меньше, чем товаров, и для нашего небольшого магазина вполне достаточно зарезервировать 65535 категорий/подкатегорий; для обоих полей используется тип SMALLINT UNSIGNED.
Поле Name имеет максимальную длину 32 символа, но этого достаточно, потому что название категории должно описываться одним, максимум двумя-тремя словами.
Описание книг
- таблицей информации о товарах, в которой описаны основные параметры книг (Books);
- таблицей информации об авторах, в которой хранятся данные об авторах книг, представленных в Интернет-магазине (Authors);
- таблицей информации об издательствах (Publishers).
| Поле таблицы | Тип данных | Описание |
|---|---|---|
| Id | MEDIUMINT UNSIGNED | Уникальный идентификатор товара |
| Category | SMALLINT UNSIGNED | Категория, к которой относится данная книга |
| Name | VARCHAR(255) | Название книги |
| Author | SMALLINT UNSIGNED | Автор книги |
| Publisher | SMALLINT UNSIGNED | Издательство |
| ISBN | CHAR(13) | Уникальный номер книги ISBN |
| ImageHREF | VARCHAR(255) | Путь к файлу изображения обложки книги |
| Synopsis | TEXT | Краткое описание |
| PagesCount | SMALLINT | Число страниц |
| PublicationDate | YEAR | Дата публикации |
| AppearDate | DATE | Время поступления книги в магазин |
| Price | DECIMAL(6,2) | Цена книги |
Так, для названия книги (поле Name) определена максимальная длина 255 символов, и используется тип VARCHAR, а не CHAR, поскольку число букв в названии книг может быть различным. Использование полей переменной длины позволяет избежать хранения ненужной информации.
Для описания числа страниц (поле PagesCount) достаточно предусмотреть тип SMALLINT, использующий 2 бита или диапазон от -32768 до +32767. Нам совсем не требуется так много, но следующий меньший тип TINYINT соответствует диапазону -128 до +127, или максимально 255 (в случае беззнакового типа), а этого недостаточно.
Дата публикации (поле PublicationDate) описана как тип YEAR, поскольку интерес представляет именно год публикации. В то же время для времени поступления книги в магазин (поле AppearDate) выбран тип DATE, так как по этому полю будет производиться поиск наиболее новых книг (например, поступивших за последнюю неделю).
Цена книги хранится в поле Price с типом DECIMAL(6,2), для данного проекта этого достаточно.
Поля Author (информация об авторе) и Publisher (информация об издательстве, выпустившем книгу) описаны как SMALLINT UNSIGNED, они являются ссылками на записи в таблицах Authors и Publishers, то есть внешними ключами.
Основные выборки из таблицы Books будут производиться по категориям (поле Category), так как книги однозначно привязаны к категории, к которой они относятся, с учетом даты появления книги в магазине (поле AppearDate), поэтому следует добавить составной индекс по этим двум полям.
В соответствии с техническим заданием необходимо обеспечить поиск товара в названиях и описаниях товара (поля Name и Synopsis), для ускорения возможностей поиска необходимо определить индексы по этим полям.
Об авторе достаточно знать имя и краткую биографическую справку. Список произведений, написанных определенным автором, формируется на основе данных таблицы Books. Параметры таблицы авторов Athors описаны в табл. 1.6.
| Поле таблицы | Тип данных | Описание |
|---|---|---|
| Id | SMALLINT UNSIGNED | Уникальный идентификатор автора |
| Name | VARCHAR(255) | Имя автора |
| Biography | TEXT | Краткая биографическая справка |
В информацию об издательстве включим название и краткую характеристику. В то же время ссылку на сайт, например, категорически нельзя включать, поскольку многие издательства имеют свои Интернет-магазины, которые просто так рекламировать не стоит. Параметры таблицы издательств описаны в табл. 1.7.
| Поле таблицы | Тип данных | Описание |
|---|---|---|
| Id | SMALLINT UNSIGNED | Уникальный идентификатор издательства |
| Name | VARCHAR(255) | Название издательства |
| Description | TEXT | Краткое описание издательства |
Связи между таблицами Интернет-каталога
Для того чтобы более точно проследить логику спроектированной базы данных и связи между таблицами, рисуется модель логической структуры данных.
Фактически на данном этапе закончено проектирование структуры Интернет-каталога, на рис. 1.6 представлена его окончательная модель.

Рис. 1.6. Модель логической структуры данных
Данные Интернет-магазина
Информация о пользователе должна включать сведения, необходимые для доставки товара, а также данные авторизации и текущей сессии -- это связано, прежде всего, с вопросами безопасности и обеспечения доступа удаленного пользователя. Список необходимых параметров приведен в табл. 1.8.
| Поле таблицы | Тип данных | Описание |
|---|---|---|
| Id | MEDIUMINT UNSIGNED | Уникальный идентификатор покупателя |
| Name | CHAR (127) | Имя покупателя |
| Surname | CHAR (127) | Фамилия покупателя |
| VARCHAR(64) | E-Mail покупателя | |
| Phone | VARCHAR(20) | Телефон для подтверждения заказа |
| Address | VARCHAR(255) | Адрес доставки |
| IP | CHAR(14) | Текущий IP покупателя |
| SessionKey | INT UNSIGNED | Уникальный код для авторизации |
| LastVisit | DATETIME | Время последнего посещения |
| OrderID | INT UNSIGNED | Номер текущего заказа |
Поле Email определено длиной 64 символа. Возможно, это излишне, так как большинство адресов не превышают 15-30 символов, но представим, что кто-то с очень длинным адресом захочет купить товар в этом магазине. В случае с информацией о покупателях лучше перестраховаться и предусмотреть такую возможность.
Поле Phone (номер телефона для подтверждения заказа) используется для хранения как номера телефона, так и кода города/страны (например, 7-(812)-312-00-00), если пользователь ввел эту информацию.
Для поддержания сессий пользователя идентификация выполняется по полям IP (текущий IP покупателя) и SessionKey (уникальный код для авторизации).
Первичным ключом в данном случае является Id, но кроме Id пользователь также характеризуется уникальным E-Mail-адресом. Основные выборки будут производиться по полям Id, IP и LastVisit, эти поля включаются в отдельный индекс.
В приложении будет использована упрощенная схема пользовательской корзинки. Информация о добавленном в корзинку товаре непосредственно помещается в таблицу. Для реализации упрощенной схемы пользовательской корзинки достаточно параметров, описанных в табл. 1.9.
| Поле таблицы | Тип данных | Описание |
|---|---|---|
| Id | INT UNSIGNED | Номер заказа |
| Amount | TINYINT | Число товаров, добавленных в покупательскую корзинку |
| Book | INT UNSIGNED | Идентификатор добавленного товара |
Связи между таблицами Интернет-магазина
- DROP TABLE IF EXISTS Users;
- DROP TABLE IF EXISTS Orders;
- DROP TABLE IF EXISTS Books;
- DROP TABLE IF EXISTS Authors;
- DROP TABLE IF EXISTS Categories;
- DROP TABLE IF EXISTS Publishers;
- #==============================================================#
- # Table : Publishers #
- #==============================================================#
- CREATE TABLE Publishers (
- Id SMALLINT NOT NULL AUTO_INCREMENT,
- Name VARCHAR(255) NOT NULL,
- Description TEXT NOT NULL,
- PRIMARY KEY (Id)
- );
- #==============================================================#
- # Table : Authors #
- #==============================================================#
- CREATE TABLE Authors (
- Id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
- Name VARCHAR(255) NOT NULL,
- Biography TEXT NOT NULL,
- PRIMARY KEY (Id)
- );
- #==============================================================#
- # Table : Categories #
- #==============================================================#
- CREATE TABLE Categories (
- Id SMALLINT NOT NULL AUTO_INCREMENT,
- ParentCategory SMALLINT NOT NULL,
- Name VARCHAR(32) NOT NULL,
- PRIMARY KEY (Id),
- INDEX (ParentCategory),
- CONSTRAINT FK_CATEGORI_REFERENCE_CATEGORI FOREIGN KEY (ParentCategory)
- REFERENCES Categories (Id)
- );
- #==============================================================#
- # Table : Books #
- #==============================================================#
- CREATE TABLE Books (
- Id MEDIUMINT NOT NULL AUTO_INCREMENT,
- Category SMALLINT NOT NULL,
- Name VARCHAR(255) NOT NULL,
- Author SMALLINT UNSIGNED NOT NULL,
- Publisher SMALLINT UNSIGNED NOT NULL,
- ISBN CHAR(13) NOT NULL,
- ImageHREF VARCHAR(255) NOT NULL,
- Synopsis TEXT NOT NULL,
- PagesCount SMALLINT NOT NULL,
- PublicationDate YEAR NOT NULL,
- AppearDate DATE NOT NULL,
- Price DECIMAL(6,2) NOT NULL,
- PRIMARY KEY (Id),
- INDEX (Category, AppearDate),
- INDEX (Author),
- INDEX (Publisher),
- FULLTEXT INDEX (Name),
- FULLTEXT INDEX (Synopsis),
- CONSTRAINT FK_Books_REFERENCE_Authors FOREIGN KEY (Author)
- REFERENCES Authors (Id),
- CONSTRAINT FK_Books_REFERENCE_PUBLISHE FOREIGN KEY (Publisher)
- REFERENCES PublisherS (Id),
- CONSTRAINT FK_Books_REFERENCE_CATEGORI FOREIGN KEY (Category)
- REFERENCES Categories (Id)
- );
- #==============================================================#
- # Table : Orders #
- #==============================================================#
- CREATE TABLE Orders (
- Id INT NOT NULL,
- Amount TINYINT NOT NULL,
- Book MEDIUMINT NOT NULL,
- INDEX (Id),
- INDEX (Book),
- CONSTRAINT FK_Orders_REFERENCE_Books FOREIGN KEY (Book)
- REFERENCES Books (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,
- IP CHAR(14) NOT NULL,
- SessionKey INT UNSIGNED NOT NULL,
- LastVisit DATETIME NOT NULL,
- OrderID INT UNSIGNED NOT NULL,
- PRIMARY KEY (Id),
- INDEX (Id, IP, LastVisit),
- INDEX(Email, Password),
- CONSTRAINT FK_Users_REFERENCE_Orders FOREIGN KEY (OrderID)
- REFERENCES Orders (Id)
- );
Для Интернет-каталога размещение банеров на своих страницах, обмен ими с другими Интернет-каталогами поможет привлечь новых посетителей. Кроме того, рекламодатели готовы платить за рекламные площадки при условии их популярности или специфической целенаправленности. Наконец, банерные показы известных банерных систем продаются на банерных биржах, обмениваются на услуги или товары, то есть могут приносить доход.
Прежде чем планировать рекламные кампании на сайте, необходимо выбрать вариант расчета за рекламу. Несколько наиболее популярных вариантов расчета:
- фиксированная плата за оговоренный период;
- оплата по числу показов;
- оплата по числу нажатий на банер.
Для организации небольшой банерной сети достаточно параметров, перечисленных в табл. 1.10.
Поле Id однозначно характеризует учетную запись банера -- это первичный ключ таблицы Banners.
Графический банер характеризуется, в первую очередь, размерами, они описаны в полях Height и Width. Эти параметры позволят использовать графические банеры нескольких форматов.
| Поле таблицы | Тип данных | Описание |
|---|---|---|
| Id | MEDIUMINT | Уникальный идентификатор банера |
| Height | SMALLINT | Размер банера по высоте |
| Width | SMALLINT | Размер банера по ширине |
| URL | VARCHAR(255) | URL файла банера |
| Link | VARCHAR(255) | Ссылка, по которой будет переходить пользователь после нажатия на банер |
| ShowCount | MEDIUMINT | Число показанных банеров |
| ShowMax | MEDIUMINT | Максимальное число показов банеров для этого Id |
| ClickCount | MEDIUMINT | Число нажатий на банер пользователями |
Ссылка, по которой будет переходить пользователь после нажатия на банер, хранится в поле Link.
Информация о числе банеров, показанных пользователям, находится в поле ShowCount, а максимальное число показов банера, после превышения которого он не будет показываться, -- в поле ShowMax.
Выборка банера для показа производится по размеру банера, с учетом числа показов; банеры, выработавшие максимальное число показов, больше не должны показываться. В некоторых случаях, например при подключении внешних банерных сетей, не нужно ограничивать количество показов банеров. Максимальное число показов указывается в поле ShowMax. Нулевое значение в этом поле указывает на неограниченный ресурс банера.
Универсальные Интернет-магазины и Интернет-каталоги за счет своей универсальности доступны компаниям различной направленности независимо от того, какой товар они будут представлять в Интернет-каталоге или продавать через построенный таким образом Интернет-магазин.
Свойства, описывающие товары, задаются не непосредственно полями базы данных, как в нашем приложении, а выбираются как параметры из унифицированных таблиц параметров.

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