mirror of
https://github.com/EDeev/mobiles_dataset.git
synced 2026-06-15 11:01:02 +03:00
105 lines
No EOL
3.6 KiB
SQL
105 lines
No EOL
3.6 KiB
SQL
-- Создание базы данных
|
||
-- Инструкция: Выполните этот скрипт в pgAdmin или psql под пользователем postgres
|
||
CREATE DATABASE mobile_devices_db
|
||
WITH
|
||
OWNER = postgres
|
||
ENCODING = 'UTF8'
|
||
CONNECTION LIMIT = -1;
|
||
|
||
-- Подключитесь к созданной БД
|
||
\c mobile_devices_db;
|
||
|
||
-- 1. Таблица компаний-производителей
|
||
CREATE TABLE companies (
|
||
company_id SERIAL PRIMARY KEY,
|
||
company_name VARCHAR(100) NOT NULL UNIQUE
|
||
);
|
||
|
||
-- 2. Таблица процессоров (справочник)
|
||
CREATE TABLE processors (
|
||
processor_id SERIAL PRIMARY KEY,
|
||
processor_name VARCHAR(200) NOT NULL UNIQUE
|
||
);
|
||
|
||
-- 3. Таблица моделей устройств
|
||
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)
|
||
);
|
||
|
||
-- 4. Таблица регионов/стран
|
||
CREATE TABLE regions (
|
||
region_id SERIAL PRIMARY KEY,
|
||
region_name VARCHAR(50) NOT NULL UNIQUE,
|
||
region_code VARCHAR(10) UNIQUE
|
||
);
|
||
|
||
-- 5. Таблица цен в различных регионах
|
||
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)
|
||
);
|
||
|
||
-- 6. Создание индексов для оптимизации производительности
|
||
-- Эти индексы пока не создаем (для выполнения задания с EXPLAIN ANALYZE)
|
||
-- CREATE INDEX idx_models_company_id ON models(company_id);
|
||
-- CREATE INDEX idx_models_launched_year ON models(launched_year);
|
||
-- CREATE INDEX idx_prices_model_id ON prices(model_id);
|
||
-- CREATE INDEX idx_prices_region_id ON prices(region_id);
|
||
-- CREATE INDEX idx_companies_name ON companies(company_name);
|
||
-- CREATE INDEX idx_models_name ON models(model_name);
|
||
|
||
-- 7. Вставка начальных данных для регионов
|
||
INSERT INTO regions (region_name, region_code) VALUES
|
||
('Pakistan', 'PK'),
|
||
('India', 'IN'),
|
||
('China', 'CN'),
|
||
('USA', 'US'),
|
||
('Dubai', 'AE');
|
||
|
||
-- 8. Создание представлений для удобства работы
|
||
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;
|
||
|
||
-- 9. Представление для анализа цен по регионам
|
||
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; |