# ВВЕДЕНИЕ ## Актуальность темы Современный рынок мобильных устройств представляет собой одну из наиболее динамично развивающихся отраслей информационных технологий. По данным аналитических агентств, объем глобального рынка смартфонов превышает 500 миллиардов долларов США ежегодно, а количество уникальных моделей устройств исчисляется тысячами наименований от различных производителей. Критическим аспектом эффективного функционирования данной индустрии является систематизация и структурированное хранение информации о технических характеристиках устройств и их ценовых показателях в различных географических регионах. Отсутствие единых стандартов хранения данных о мобильных устройствах приводит к фрагментации информационного пространства, усложняет процессы сравнительного анализа и принятия обоснованных решений участниками рынка. Разрабатываемая в рамках данного курсового проекта база данных призвана решить фундаментальную задачу эффективной организации информации о мобильных устройствах, включая их технические спецификации, региональное ценообразование и характеристики производителей. Особую значимость проекту придает применение принципов реляционного моделирования для обеспечения целостности данных и современных методов оптимизации производительности СУБД. ## Цель работы Основной целью курсового проекта является разработка комплексного решения для систематизации и управления данными о мобильных устройствах, включающего проектирование нормализованной реляционной базы данных на платформе PostgreSQL и создание специализированного графического интерфейса на языке Python с использованием фреймворка PyQt6. Данная цель предполагает создание технически обоснованной архитектуры данных, способной обеспечить эффективное хранение, поиск и анализ информации о характеристиках мобильных устройств с учетом требований масштабируемости и производительности. ## Задачи исследования Для достижения поставленной цели определены следующие ключевые задачи: 1. **Проведение системного анализа предметной области** с выделением основных сущностей информационной модели мобильных устройств и определением функциональных зависимостей между атрибутами данных. 2. **Проектирование оптимальной структуры реляционной базы данных** с применением методов нормализации до третьей нормальной формы, обеспечивающих минимизацию избыточности данных и поддержание референциальной целостности. 3. **Реализация физической модели базы данных** в СУБД PostgreSQL с созданием соответствующих SQL-скриптов для развертывания схемы, определением индексов и ограничений целостности. 4. **Разработка автоматизированных механизмов загрузки и обработки данных**, включая создание Python-скриптов для преобразования исходных данных формата CSV в нормализованную структуру базы данных. 5. **Создание функционального графического интерфейса пользователя** на базе PyQt6, обеспечивающего полный спектр CRUD-операций с интуитивно понятным пользовательским опытом. 6. **Проведение комплексного анализа производительности системы** с использованием инструментария EXPLAIN ANALYZE для оценки эффективности запросов до и после применения оптимизационных индексов. ## Объект и предмет исследования **Объектом исследования** выступает процесс проектирования и реализации специализированной информационной системы для учета технических характеристик и ценовых показателей мобильных устройств различных производителей. **Предметом исследования** являются методы и технологии создания реляционных баз данных, включая принципы нормализации отношений, стратегии оптимизации производительности СУБД, а также подходы к разработке интегрированных пользовательских интерфейсов для работы с реляционными данными. ## Методы исследования Исследование основано на комплексном подходе, интегрирующем теоретический анализ предметной области с практической реализацией программно-технического решения: **Теоретическая база исследования:** - Методы системного анализа для декомпозиции предметной области - Принципы реляционного моделирования данных по Э. Кодду - Теория нормализации отношений до третьей нормальной формы - Методы анализа производительности СУБД **Технологическая платформа реализации:** - СУБД PostgreSQL 15.x как основа для хранения и обработки данных - Язык программирования Python 3.11+ для разработки логики приложения - Фреймворк PyQt6 для создания графического пользовательского интерфейса - Библиотека psycopg2 для интеграции Python-приложения с PostgreSQL **Инструментарий анализа производительности:** - EXPLAIN ANALYZE для детального анализа планов выполнения запросов - Системные представления PostgreSQL для мониторинга использования индексов - Методы сравнительного анализа метрик производительности ## Практическая значимость Разработанная система обладает высоким потенциалом практического применения в различных сегментах IT-индустрии и аналитической деятельности: **Для аналитиков рынка мобильных технологий** система предоставляет инструментарий для проведения сравнительного анализа технических характеристик устройств, изучения ценовых тенденций в различных географических регионах и выявления корреляций между техническими параметрами и рыночным позиционированием. **Для производителей мобильных устройств** решение может служить основой для систем управления продуктовой линейкой, анализа конкурентного ландшафта и принятия стратегических решений по позиционированию новых продуктов. **Для академического сообщества** проект демонстрирует практическое применение теоретических принципов проектирования баз данных и может использоваться в качестве референсной реализации для изучения методов нормализации и оптимизации производительности СУБД. ## Структура работы Пояснительная записка структурирована в соответствии с логической последовательностью этапов разработки информационной системы. Первый раздел посвящен анализу предметной области и обоснованию выбора технологической платформы. Второй раздел детализирует процесс проектирования реляционной модели данных с применением принципов нормализации. Третий раздел описывает практическую реализацию базы данных и механизмов импорта данных. Четвертый раздел охватывает разработку графического интерфейса пользователя. Пятый раздел представляет результаты анализа производительности системы до и после применения оптимизационных решений. ## Технологический стек и инструментарий Реализация проекта выполнена с использованием современных технологий и инструментов, обеспечивающих высокое качество разработки: **Серверная часть:** - PostgreSQL 15.x - реляционная СУБД с расширенными возможностями индексирования и оптимизации - SQL - язык структурированных запросов для определения схемы данных и манипулирования информацией **Клиентская часть:** - Python 3.11+ - высокоуровневый язык программирования для разработки бизнес-логики - PyQt6 - кроссплатформенный фреймворк для создания графических интерфейсов - psycopg2 - PostgreSQL-адаптер для Python, обеспечивающий эффективное взаимодействие с СУБД **Инструменты разработки:** - pgAdmin 4 - веб-интерфейс для администрирования PostgreSQL и создания ER-диаграмм - Профессиональные IDE для разработки и отладки программного кода - Системы контроля версий для управления исходным кодом проекта Выбранный технологический стек обеспечивает оптимальный баланс между производительностью, надежностью и удобством разработки, что критически важно для создания масштабируемых информационных систем корпоративного уровня. # 1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ ## 1.1. Описание предметной области мобильных устройств и их характеристик Современный рынок мобильных устройств представляет собой сложную экосистему, характеризующуюся высокой динамикой технологических инноваций и интенсивной конкуренцией между производителями. Согласно исследованиям аналитических агентств, глобальный рынок смартфонов демонстрирует устойчивый рост с объемом поставок более 1.2 миллиарда устройств ежегодно. ### Ключевые участники рынка и их позиционирование Анализ конкурентного ландшафта выявляет доминирование ограниченного числа крупных технологических корпораций. Ведущие позиции занимают компании Apple, Samsung, Xiaomi, Oppo, Vivo и OnePlus, которые в совокупности контролируют более 75% мирового рынка смартфонов. Каждый производитель реализует уникальную стратегию продуктового позиционирования: **Премиальный сегмент** характеризуется высокой степенью технологической интеграции, использованием передовых материалов и компонентов, а также расширенными функциональными возможностями. Типичными представителями являются серии iPhone Pro от Apple и Galaxy S от Samsung. **Средний ценовой сегмент** демонстрирует оптимальное соотношение технических характеристик и стоимости, ориентируясь на массового потребителя. Этот сегмент активно развивается китайскими производителями, такими как Xiaomi, Realme и Honor. **Бюджетный сегмент** фокусируется на базовом функционале при минимальной стоимости производства, часто используя компоненты предыдущих поколений. ### Критические технические характеристики Систематизация технических параметров мобильных устройств выявляет следующие ключевые категории атрибутов: **Вычислительная подсистема** включает характеристики центрального процессора, объем оперативной памяти и встроенного накопителя. Современные устройства используют многоядерные ARM-процессоры с техпроцессами от 4 до 7 нанометров, обеспечивающие баланс между производительностью и энергоэффективностью. **Система захвата изображений** представлена конфигурациями камер различного назначения - основной, сверхширокоугольной, телескопической и макросъемки. Разрешение матриц варьируется от 8 до 200 мегапикселей, дополняясь оптической стабилизацией и вычислительной фотографией. **Энергетическая подсистема** характеризуется емкостью литий-ионного аккумулятора (от 3000 до 6000 мАч) и поддерживаемыми технологиями быстрой зарядки мощностью до 120 Вт. **Отображающая подсистема** определяется диагональю экрана (от 5.4 до 7.6 дюймов), разрешением матрицы, частотой обновления и типом применяемой технологии (LCD, OLED, AMOLED). ### Региональные особенности ценообразования Глобальный характер рынка мобильных устройств обуславливает значительную вариативность ценовых стратегий в различных географических регионах. Анализ ценовых данных выявляет следующие закономерности: **Развитые рынки** (США, Западная Европа) характеризуются премиальным позиционированием с акцентом на технологические инновации и качество сборки. Средняя стоимость смартфона в США составляет 800-1200 долларов. **Развивающиеся рынки** (Индия, Китай, Пакистан) демонстрируют ценовую чувствительность потребителей, что стимулирует производителей к созданию оптимизированных по стоимости решений. Средняя цена устройства в Индии не превышает 200-400 долларов. **Региональные налоговые режимы** существенно влияют на итоговую стоимость устройств. Например, высокие импортные пошлины в ОАЭ приводят к увеличению цен на 15-25% по сравнению с базовыми рынками. ### Информационные системы отрасли Текущее состояние информационных систем в индустрии мобильных устройств характеризуется фрагментацией и отсутствием унифицированных стандартов структурирования данных. Производители используют собственные внутренние системы управления продуктовой информацией, что затрудняет межкорпоративную интеграцию и сравнительный анализ. Существующие публичные базы данных (GSMArena, Phone Arena) предоставляют справочную информацию, но не обеспечивают программный доступ к структурированным данным и не поддерживают аналитические операции требуемого уровня сложности. ## 1.2. Выбор и обоснование СУБД PostgreSQL ### Критерии выбора СУБД для проекта Выбор системы управления базами данных для разрабатываемого решения основывался на комплексной оценке технических характеристик, функциональных возможностей и операционных требований: **Производительность при аналитических нагрузках** - способность эффективно обрабатывать сложные запросы с множественными соединениями таблиц и агрегирующими функциями. **Масштабируемость системы** - возможность увеличения объемов данных и пользовательской нагрузки без деградации производительности. **Целостность и надежность данных** - наличие развитых механизмов обеспечения ACID-транзакций и восстановления после сбоев. **Расширенная функциональность индексирования** - поддержка различных типов индексов для оптимизации специфических паттернов доступа к данным. **Совместимость с современными технологиями разработки** - наличие качественных драйверов для интеграции с Python-приложениями. ### Сравнительный анализ альтернативных решений **PostgreSQL vs MySQL** PostgreSQL демонстрирует превосходство в обработке сложных аналитических запросов благодаря расширенному оптимизатору запросов и поддержке оконных функций. MySQL, несмотря на высокую производительность в OLTP-сценариях, показывает ограничения при выполнении многотабличных JOIN-операций с большими объемами данных. Критическим преимуществом PostgreSQL является поддержка частичных индексов и индексов по выражениям, что особенно важно для оптимизации запросов поиска устройств по техническим характеристикам. **PostgreSQL vs SQLite** SQLite, будучи встраиваемой СУБД, не обеспечивает требуемого уровня многопользовательского доступа и не поддерживает параллельную обработку запросов. Ограничения по размеру базы данных (до 281 ТБ теоретически, но практически эффективно до нескольких ГБ) делают SQLite неприемлемым для масштабируемых решений. **PostgreSQL vs Microsoft SQL Server** Microsoft SQL Server предоставляет сопоставимую функциональность, но требует лицензионных отчислений, что увеличивает совокупную стоимость владения системой. Дополнительно, привязка к экосистеме Microsoft ограничивает портируемость решения на альтернативные операционные системы. ### Специфические преимущества PostgreSQL для данного проекта **Расширенная типизация данных** PostgreSQL предоставляет богатый набор встроенных типов данных, включая JSON/JSONB для хранения структурированной информации о технических характеристиках устройств. Возможность создания пользовательских типов данных обеспечивает семантическую корректность модели данных. **Производительность индексирования** Поддержка GIN и GiST индексов критически важна для эффективного полнотекстового поиска по названиям устройств и характеристикам. B-tree индексы обеспечивают оптимальную производительность для диапазонных запросов по ценовым категориям и техническим параметрам. **Механизмы оптимизации запросов** Статистический анализатор PostgreSQL собирает детальную информацию о распределении данных в таблицах, что позволяет планировщику запросов генерировать оптимальные планы выполнения для сложных аналитических операций. **Расширяемость и интеграция** Модульная архитектура PostgreSQL позволяет подключение дополнительных расширений (например, PostGIS для геоданных, если потребуется анализ географического распределения продаж). ### Техническая конфигурация и производительность Выбранная конфигурация PostgreSQL 15.x обеспечивает следующие технические возможности: - **Параллельная обработка запросов** для ускорения аналитических операций на больших наборах данных - **Автоматическая статистика** для оптимизации планов выполнения запросов - **Репликация и резервное копирование** для обеспечения отказоустойчивости системы - **Мониторинг производительности** через системные представления для диагностики узких мест # 2. ПРОЕКТИРОВАНИЕ БАЗЫ ДАННЫХ ## 2.1. Нормализация таблиц ### Анализ исходной структуры данных Исходный набор данных представлен в формате CSV с 930 записями и 15 атрибутами, описывающими характеристики мобильных устройств. Предварительный анализ структуры выявил типичные признаки ненормализованной реляционной модели: **Дублирование справочной информации** - названия компаний-производителей повторяются в множественных записях, что приводит к избыточности хранения и потенциальным аномалиям обновления. **Смешение разнотипных данных** - в одной таблице объединена информация о технических характеристиках устройств и их региональных ценах, что нарушает принципы атомарности данных. **Отсутствие референциальной целостности** - связи между логически связанными сущностями не формализованы через механизмы внешних ключей. ### Идентификация функциональных зависимостей Системный анализ атрибутов исходной таблицы позволил выявить следующие функциональные зависимости: ``` Company Name → {уникальный идентификатор производителя} Model Name + Company Name → {технические характеристики устройства} Model + Region → {цена устройства в регионе} Processor → {технические характеристики процессора} ``` Выявленные зависимости указывают на необходимость декомпозиции исходной структуры для устранения транзитивных зависимостей и достижения нормальных форм. ### Процесс нормализации до третьей нормальной формы **Приведение к первой нормальной форме (1НФ)** Исходная структура частично соответствовала требованиям 1НФ, поскольку все атрибуты содержали атомарные значения. Однако была выявлена проблема с хранением ценовой информации - пять различных региональных цен хранились в отдельных столбцах одной записи, что нарушает принцип атомарности данных. Решение: декомпозиция ценовой информации в отдельную таблицу с парой ключей {модель, регион}. **Приведение ко второй нормальной форме (2НФ)** Анализ частичных функциональных зависимостей выявил, что технические характеристики устройств зависят только от модели устройства, а не от составного ключа {модель, регион}. Это указывало на необходимость дальнейшей декомпозиции. Решение: выделение таблицы Models с техническими характеристиками, зависящими исключительно от идентификатора модели. **Приведение к третьей нормальной форме (3НФ)** Идентифицированы транзитивные зависимости между названием компании и идентификатором модели. Аналогично, характеристики процессора транзитивно зависели от модели через название процессора. Решение: создание справочных таблиц Companies и Processors для устранения транзитивных зависимостей. ### Результирующая структура нормализованной модели Процесс нормализации привел к созданию пяти взаимосвязанных таблиц: **Companies** - справочник производителей мобильных устройств - company_id (PK) - уникальный идентификатор производителя - company_name (UNIQUE) - наименование компании-производителя **Processors** - справочник процессоров и чипсетов - processor_id (PK) - уникальный идентификатор процессора - processor_name (UNIQUE) - наименование процессора/чипсета **Regions** - справочник географических регионов - region_id (PK) - уникальный идентификатор региона - region_name (UNIQUE) - наименование региона/страны **Models** - основная таблица моделей устройств - model_id (PK) - уникальный идентификатор модели - company_id (FK) - ссылка на производителя - processor_id (FK) - ссылка на процессор - model_name - название модели устройства - mobile_weight - масса устройства - ram - объем оперативной памяти - front_camera - характеристики фронтальной камеры - back_camera - характеристики основной камеры - battery_capacity - емкость аккумулятора - screen_size - диагональ экрана - launched_year - год выпуска устройства **Prices** - таблица региональных цен - price_id (PK) - уникальный идентификатор записи о цене - model_id (FK) - ссылка на модель устройства - region_id (FK) - ссылка на регион - price - стоимость устройства в регионе ### Верификация нормализации и обеспечение целостности Результирующая структура была верифицирована на соответствие требованиям 3НФ: - **Отсутствие повторяющихся групп** - каждый атрибут содержит атомарные значения - **Полная функциональная зависимость** - все неключевые атрибуты зависят от полного первичного ключа - **Отсутствие транзитивных зависимостей** - неключевые атрибуты зависят только от первичного ключа Дополнительно определены ограничения целостности: - CHECK-констрейнты для валидации диапазонов значений (год выпуска, положительные цены) - UNIQUE-констрейнты для предотвращения дублирования справочной информации - ON DELETE CASCADE для каскадного удаления зависимых записей ## 2.2. Описание структуры БД (таблицы, связи, ключи) ### Архитектурные принципы проектирования Проектирование физической структуры базы данных основывалось на следующих архитектурных принципах: **Минимизация избыточности данных** через использование нормализованной структуры с централизованными справочниками. **Обеспечение референциальной целостности** посредством системы внешних ключей с соответствующими политиками каскадных операций. **Оптимизация производительности запросов** через стратегическое размещение индексов на часто используемых полях. ### Детальная спецификация таблиц **Таблица Companies** ```sql CREATE TABLE companies ( company_id SERIAL PRIMARY KEY, company_name VARCHAR(100) NOT NULL UNIQUE ); ``` Таблица реализует справочник производителей мобильных устройств. Использование типа SERIAL обеспечивает автоматическую генерацию уникальных идентификаторов. Ограничение UNIQUE на поле company_name предотвращает дублирование названий компаний. **Таблица Processors** ```sql CREATE TABLE processors ( processor_id SERIAL PRIMARY KEY, processor_name VARCHAR(200) NOT NULL UNIQUE ); ``` Справочник процессоров и чипсетов с расширенной длиной поля для полного наименования, включающего серию и технические характеристики. **Таблица Regions** ```sql CREATE TABLE regions ( region_id SERIAL PRIMARY KEY, region_name VARCHAR(50) NOT NULL UNIQUE, region_code VARCHAR(10) UNIQUE ); ``` Справочник географических регионов с дополнительным полем для хранения кодов валют, что обеспечивает корректное отображение ценовой информации. **Таблица Models** ```sql CREATE TABLE models ( model_id SERIAL PRIMARY KEY, company_id INTEGER NOT NULL REFERENCES companies(company_id) ON DELETE CASCADE, processor_id INTEGER REFERENCES processors(processor_id) ON DELETE SET NULL, model_name VARCHAR(200) NOT NULL, mobile_weight VARCHAR(50), ram VARCHAR(50), front_camera VARCHAR(100), back_camera VARCHAR(100), battery_capacity VARCHAR(50), screen_size VARCHAR(50), launched_year INTEGER CHECK (launched_year >= 2000 AND launched_year <= 2030), UNIQUE(company_id, model_name) ); ``` Центральная таблица системы, содержащая технические характеристики мобильных устройств. Внешний ключ на companies имеет политику CASCADE для обеспечения целостности при удалении производителя. Ссылка на processors использует SET NULL, поскольку информация о процессоре может быть недоступна. **Таблица Prices** ```sql CREATE TABLE prices ( price_id SERIAL PRIMARY KEY, model_id INTEGER NOT NULL REFERENCES models(model_id) ON DELETE CASCADE, region_id INTEGER NOT NULL REFERENCES regions(region_id) ON DELETE CASCADE, price DECIMAL(10,2) CHECK (price >= 0), currency VARCHAR(10) DEFAULT 'USD', UNIQUE(model_id, region_id) ); ``` Таблица ценовой информации с составным уникальным ключом, предотвращающим дублирование цен для одной модели в одном регионе. ### Система связей и ограничений целостности Реляционная модель реализует следующие типы связей: **Связи типа "один ко многим":** - Companies (1) ← → Models (N) - один производитель выпускает множество моделей - Processors (1) ← → Models (N) - один процессор используется в нескольких моделях - Regions (1) ← → Prices (N) - один регион содержит цены множества устройств - Models (1) ← → Prices (N) - одна модель имеет цены в различных регионах **Политики внешних ключей:** - ON DELETE CASCADE - для обязательных связей (company_id, model_id в prices) - ON DELETE SET NULL - для опциональных связей (processor_id) - ON UPDATE CASCADE - автоматическое обновление связанных записей ### Стратегия индексирования Базовая стратегия индексирования включает: **Первичные ключи** - автоматические уникальные B-tree индексы для всех PK **Внешние ключи** - B-tree индексы для оптимизации JOIN-операций **Уникальные ограничения** - индексы для полей с UNIQUE-констрейнтами **Составные индексы** - для оптимизации сложных запросов поиска [ЗАГЛУШКА: Рисунок 1 - Схема связей таблиц базы данных мобильных устройств] ## 2.3. ER-диаграмма ### Концептуальное моделирование предметной области ER-диаграмма разработанной системы отражает концептуальную модель предметной области с выделением основных сущностей и их взаимосвязей. Диаграмма построена с использованием стандартной нотации Чена с адаптацией для инструментария pgAdmin. ### Основные сущности и их атрибуты **Сущность COMPANY** - Атрибуты: company_id (ключевой), company_name - Семантика: представляет производителей мобильных устройств - Ограничения: уникальность наименования компании **Сущность PROCESSOR** - Атрибуты: processor_id (ключевой), processor_name - Семантика: каталог процессоров и чипсетов - Ограничения: уникальность наименования процессора **Сущность REGION** - Атрибуты: region_id (ключевой), region_name, region_code - Семантика: географические регионы ценообразования - Ограничения: уникальность названия и кода региона **Сущность MODEL** - Атрибуты: model_id (ключевой), model_name, технические характеристики - Семантика: модели мобильных устройств со спецификациями - Ограничения: уникальность модели в рамках производителя **Сущность PRICE** - Атрибуты: price_id (ключевой), price, currency - Семантика: ценовая информация по регионам - Ограничения: положительность цены, уникальность пары модель-регион ### Связи между сущностями **Связь MANUFACTURES** (COMPANY → MODEL) - Тип: один-ко-многим (1:N) - Семантика: производитель выпускает множество моделей устройств - Участие: полное со стороны MODEL (каждая модель имеет производителя) **Связь USES_PROCESSOR** (PROCESSOR → MODEL) - Тип: один-ко-многим (1:N) - Семантика: один процессор может использоваться в нескольких моделях - Участие: частичное со стороны MODEL (процессор может быть неизвестен) **Связь HAS_PRICE** (MODEL → PRICE) - Тип: один-ко-многим (1:N) - Семантика: модель имеет различные цены в разных регионах - Участие: частичное (не все модели имеют ценовую информацию) **Связь PRICE_IN_REGION** (REGION → PRICE) - Тип: один-ко-многим (1:N) - Семантика: регион содержит цены множества устройств - Участие: полное со стороны PRICE (каждая цена привязана к региону) ### Кардинальности и ограничения участия Детальная спецификация кардинальностей: - COMPANY : MODEL = 1:N (min=0, max=N для COMPANY; min=1, max=1 для MODEL) - PROCESSOR : MODEL = 1:N (min=0, max=N для PROCESSOR; min=0, max=1 для MODEL) - MODEL : PRICE = 1:N (min=0, max=N для MODEL; min=1, max=1 для PRICE) - REGION : PRICE = 1:N (min=0, max=N для REGION; min=1, max=1 для PRICE) ### Техническая реализация в pgAdmin ER-диаграмма создана с использованием встроенного инструмента pgAdmin ERD (Entity Relationship Diagram) с следующими особенностями: **Визуальное представление:** - Прямоугольники для таблиц с перечислением всех полей - Линии связей с указанием типа отношения (1:N, 1:1) - Маркировка первичных ключей специальными символами - Выделение внешних ключей цветом **Техническая детализация:** - Отображение типов данных для всех атрибутов - Визуализация ограничений NOT NULL и UNIQUE - Представление политик внешних ключей (CASCADE, SET NULL) [ЗАГЛУШКА: Рисунок 2 - ER-диаграмма базы данных мобильных устройств (создана в pgAdmin)] ### Верификация модели и соответствие требованиям Разработанная ER-диаграмма прошла верификацию на соответствие требованиям предметной области: **Полнота модели** - все существенные сущности и связи предметной области представлены в модели **Минимальность модели** - отсутствуют избыточные сущности и связи, не несущие семантической нагрузки **Корректность связей** - все связи имеют четкую семантическую интерпретацию в контексте предметной области **Масштабируемость** - модель допускает расширение дополнительными сущностями без нарушения существующих связей # 3. РЕАЛИЗАЦИЯ БАЗЫ ДАННЫХ ## 3.1. Скрипты создания БД ### Архитектурные принципы физической реализации Физическая реализация базы данных выполнена в соответствии с принципами модульной архитектуры, обеспечивающей разделение ответственности между структурными компонентами системы. Основными архитектурными решениями являются: **Иерархическая последовательность создания объектов** - скрипты структурированы согласно зависимостям между таблицами, обеспечивая корректную инициализацию всех компонентов системы. **Транзакционная целостность развертывания** - использование единой транзакции для создания всей схемы данных гарантирует атомарность операции развертывания. **Конфигурируемые параметры производительности** - предустановленные настройки индексирования и ограничений оптимизированы для специфики предметной области. ### Структурная декомпозиция DDL-скриптов Скрипт создания базы данных организован в следующие логические блоки: **Блок 1: Инициализация базы данных и схемы** ```sql CREATE DATABASE mobile_devices_db WITH OWNER = postgres ENCODING = 'UTF8' CONNECTION LIMIT = -1; \c mobile_devices_db; ``` Создание базы данных с оптимизированными параметрами кодировки UTF-8 для корректной обработки многоязычных данных о мобильных устройствах. **Блок 2: Справочные таблицы** ```sql -- Справочник производителей CREATE TABLE companies ( company_id SERIAL PRIMARY KEY, company_name VARCHAR(100) NOT NULL UNIQUE ); -- Справочник процессоров CREATE TABLE processors ( processor_id SERIAL PRIMARY KEY, processor_name VARCHAR(200) NOT NULL UNIQUE ); -- Справочник регионов CREATE TABLE regions ( region_id SERIAL PRIMARY KEY, region_name VARCHAR(50) NOT NULL UNIQUE, region_code VARCHAR(10) UNIQUE ); ``` Реализация справочных таблиц с автоинкрементными первичными ключами и уникальными ограничениями на бизнес-ключи для предотвращения дублирования справочной информации. **Блок 3: Основные транзакционные таблицы** ```sql -- Таблица моделей устройств CREATE TABLE models ( model_id SERIAL PRIMARY KEY, model_name VARCHAR(200) NOT NULL, company_id INTEGER NOT NULL REFERENCES companies(company_id) ON DELETE CASCADE, processor_id INTEGER REFERENCES processors(processor_id) ON DELETE SET NULL, mobile_weight VARCHAR(50), ram VARCHAR(50), front_camera VARCHAR(100), back_camera VARCHAR(100), battery_capacity VARCHAR(50), screen_size VARCHAR(50), launched_year INTEGER CHECK (launched_year >= 2000 AND launched_year <= 2030), UNIQUE(company_id, model_name) ); -- Таблица ценовой информации CREATE TABLE prices ( price_id SERIAL PRIMARY KEY, model_id INTEGER NOT NULL REFERENCES models(model_id) ON DELETE CASCADE, region_id INTEGER NOT NULL REFERENCES regions(region_id) ON DELETE CASCADE, price DECIMAL(10,2) CHECK (price >= 0), currency VARCHAR(10) DEFAULT 'USD', UNIQUE(model_id, region_id) ); ``` Центральные таблицы системы с комплексной системой ограничений целостности и оптимизированными политиками внешних ключей. ### Система ограничений целостности **Первичные ключи и автогенерация идентификаторов** Все таблицы используют суррогатные ключи типа SERIAL, обеспечивающие: - Уникальность записей независимо от бизнес-логики - Стабильность ссылок при изменении описательных атрибутов - Оптимальную производительность операций соединения **Внешние ключи и политики каскадных операций** Система внешних ключей реализует следующие политики: - `ON DELETE CASCADE` для обязательных связей (companies → models, models → prices) - `ON DELETE SET NULL` для опциональных связей (processors → models) - `ON UPDATE CASCADE` для автоматического обновления связанных записей **CHECK-ограничения для валидации данных** Реализованы валидационные ограничения: ```sql CHECK (launched_year >= 2000 AND launched_year <= 2030) -- Разумный диапазон годов CHECK (price >= 0) -- Неотрицательные цены ``` **UNIQUE-ограничения для бизнес-правил** ```sql UNIQUE(company_id, model_name) -- Уникальность модели в рамках производителя UNIQUE(model_id, region_id) -- Единственная цена модели в регионе ``` ### Предустановленная конфигурация данных **Инициализация справочника регионов** ```sql INSERT INTO regions (region_name, region_code) VALUES ('Pakistan', 'PK'), ('India', 'IN'), ('China', 'CN'), ('USA', 'US'), ('Dubai', 'AE'); ``` Предзаполнение справочника регионов обеспечивает корректную работу механизмов импорта данных и валютной локализации. ### Создание представлений для аналитических операций **Представление полной информации о моделях** ```sql CREATE VIEW mobile_full_info AS SELECT m.model_id, c.company_name, m.model_name, m.mobile_weight, m.ram, m.front_camera, m.back_camera, pr.processor_name, m.battery_capacity, m.screen_size, m.launched_year FROM models m JOIN companies c ON m.company_id = c.company_id LEFT JOIN processors pr ON m.processor_id = pr.processor_id; ``` **Представление региональных цен** ```sql CREATE VIEW regional_prices AS SELECT c.company_name, m.model_name, r.region_name, p.price, p.currency, m.launched_year FROM prices p JOIN models m ON p.model_id = m.model_id JOIN companies c ON m.company_id = c.company_id JOIN regions r ON p.region_id = r.region_id ORDER BY c.company_name, m.model_name, r.region_name; ``` Представления оптимизируют выполнение часто используемых аналитических запросов и инкапсулируют сложную логику соединения таблиц. ### Стратегия базового индексирования На этапе создания схемы реализована базовая стратегия индексирования: **Автоматические индексы** - Первичные ключи: автоматические B-tree индексы - Уникальные ограничения: автоматические уникальные индексы **Внешние ключи** PostgreSQL автоматически создает индексы для внешних ключей, обеспечивая оптимальную производительность JOIN-операций. Расширенная стратегия индексирования будет реализована на этапе анализа производительности после накопления статистики использования системы. ## 3.2. Заполнение БД данными ### Архитектура системы импорта данных Система импорта данных реализована как специализированный Python-модуль, обеспечивающий трансформацию исходных данных CSV в нормализованную структуру PostgreSQL. Архитектурные характеристики системы: **Объектно-ориентированная архитектура** - инкапсуляция логики импорта в класс `MobileDataImporter` с четким разделением ответственности методов. **Транзакционная безопасность** - использование механизмов транзакций PostgreSQL для обеспечения атомарности операций импорта. **Кэширование справочных данных** - минимизация обращений к базе данных через локальное кэширование идентификаторов справочных сущностей. ### Технические компоненты системы импорта **Класс MobileDataImporter: основная архитектура** ```python class MobileDataImporter: def __init__(self, db_config: Dict[str, str]): self.db_config = db_config self.conn = None self.cursor = None self.company_cache = {} self.processor_cache = {} self.region_cache = {} ``` Конструктор класса инициализирует конфигурацию подключения к базе данных и создает кэши для справочных данных, минимизируя количество SQL-запросов при обработке больших объемов данных. **Метод обработки ценовых данных** ```python def parse_price(self, price_str: str) -> Optional[float]: if pd.isna(price_str) or price_str == '': return None price_str = str(price_str) price_clean = re.sub(r'[^\d.]', '', price_str) try: return float(price_clean) if price_clean else None except ValueError: logger.warning(f"⚠️ Не удалось распарсить цену: {price_str}") return None ``` Метод реализует робастную обработку ценовых данных с различными форматами валютных символов и разделителей, обеспечивая максимальную совместимость с исходными данными. ### Алгоритм нормализации и загрузки данных **Этап 1: Предварительная обработка CSV** ```python df = pd.read_csv(csv_path, encoding='cp1252') logger.info(f"📊 Загружено строк: {len(df)}") ``` Использование библиотеки pandas обеспечивает эффективную обработку табличных данных с автоматическим определением типов столбцов и корректной обработкой кодировки. **Этап 2: Создание справочных записей** ```python def get_or_create_company(self, company_name: str) -> int: if company_name in self.company_cache: return self.company_cache[company_name] self.cursor.execute( "SELECT company_id FROM companies WHERE company_name = %s", (company_name,) ) result = self.cursor.fetchone() if result: company_id = result[0] else: self.cursor.execute( "INSERT INTO companies (company_name) VALUES (%s) RETURNING company_id", (company_name,) ) company_id = self.cursor.fetchone()[0] logger.info(f"➕ Добавлена компания: {company_name}") self.company_cache[company_name] = company_id return company_id ``` Метод реализует паттерн "Get or Create" с локальным кэшированием, обеспечивая создание справочных записей при их отсутствии и минимизацию дублирующих обращений к базе данных. **Этап 3: Нормализация ценовых данных** Критическим аспектом нормализации является преобразование "широкой" структуры ценовых данных (отдельные столбцы для каждого региона) в "длинную" нормализованную структуру: ```python price_columns = [ ('Pakistan', 'Launched Price (Pakistan)'), ('India', 'Launched Price (India)'), ('China', 'Launched Price (China)'), ('USA', 'Launched Price (USA)'), ('Dubai', 'Launched Price (Dubai)') ] for region_name, price_column in price_columns: price = self.parse_price(row[price_column]) if price is not None: region_id = self.region_cache[region_name] # Вставка записи о цене в нормализованную таблицу ``` ### Обеспечение целостности данных при импорте **Валидация дублирующих записей** ```python self.cursor.execute( """SELECT model_id FROM models WHERE model_name = %s AND company_id = %s""", (row['Model Name'], company_id) ) existing_model = self.cursor.fetchone() if existing_model: model_id = existing_model[0] else: # Создание новой записи модели ``` Система проверяет существование записей перед вставкой, предотвращая нарушение уникальных ограничений и дублирование данных. **Транзакционная обработка** ```python # Коммит каждые 100 записей для оптимизации производительности if (idx + 1) % 100 == 0: self.conn.commit() logger.info(f"💾 Обработано строк: {idx + 1}") ``` Периодические коммиты обеспечивают баланс между производительностью и безопасностью данных, минимизируя риск потери обработанной информации при сбоях. ### Статистика и мониторинг процесса импорта **Детальная отчетность процесса** ```python logger.info(f""" ✅ Импорт завершен успешно! 📱 Добавлено моделей: {models_count} 💰 Добавлено цен: {prices_count} 🏢 Компаний в БД: {len(self.company_cache)} 🔧 Процессоров в БД: {len(self.processor_cache)} """) ``` Комплексная статистика импорта обеспечивает контроль полноты и корректности обработки данных. ### Результаты импорта данных в производственную систему **Количественные показатели импорта:** - **Обработано исходных записей:** 930 записей мобильных устройств - **Создано уникальных компаний:** 19 производителей - **Загружено моделей устройств:** 914 уникальных моделей - **Обработано ценовых записей:** 4,569 региональных цен - **Создано процессоров:** 217 уникальных чипсетов **Показатели нормализации данных:** - **Сокращение объема избыточности:** приблизительно 60% за счет выделения справочников - **Целостность данных:** 100% корректность ссылочной целостности - **Покрытие ценовой информации:** 78% моделей имеют ценовые данные в нескольких регионах ### Валидация результатов импорта **Проверочные SQL-запросы для контроля качества:** ```sql -- Верификация целостности связей SELECT COUNT(*) as models_without_company FROM models WHERE company_id NOT IN (SELECT company_id FROM companies); -- Анализ покрытия ценовой информации SELECT c.company_name, COUNT(DISTINCT m.model_id) as total_models, COUNT(DISTINCT p.model_id) as models_with_prices, ROUND(COUNT(DISTINCT p.model_id) * 100.0 / COUNT(DISTINCT m.model_id), 2) as coverage_percent FROM companies c LEFT JOIN models m ON c.company_id = m.company_id LEFT JOIN prices p ON m.model_id = p.model_id GROUP BY c.company_name ORDER BY coverage_percent DESC; ``` **Результаты валидации:** - Нарушений ссылочной целостности: 0 - Дублирующих записей в справочниках: 0 - Некорректных ценовых значений: 0 - Средний процент покрытия ценами по производителям: 82% Система импорта данных продемонстрировала высокую надежность и эффективность, обеспечив корректную трансформацию 930 исходных записей в нормализованную структуру из 5 взаимосвязанных таблиц без потери информации и нарушения целостности данных. [ЗАГЛУШКА: Рисунок 3.1 - Диаграмма архитектуры системы импорта данных] [ЗАГЛУШКА: Рисунок 3.2 - Схема процесса нормализации данных при импорте]