mobiles_dataset/sql/create_schema.sql
2025-06-06 18:37:39 +03:00

105 lines
No EOL
3.6 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Создание базы данных
-- Инструкция: Выполните этот скрипт в 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;