-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.sql
More file actions
124 lines (104 loc) · 5 KB
/
database.sql
File metadata and controls
124 lines (104 loc) · 5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
-- ========================================
-- СХЕМА БАЗЫ ДАННЫХ POWER PC
-- ========================================
-- Создание базы данных
-- CREATE DATABASE powerpc_db;
-- Подключение к базе данных
-- \c powerpc_db;
-- ========================================
-- ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ
-- ========================================
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
phone VARCHAR(20),
password_hash VARCHAR(255) NOT NULL,
address TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Индексы для пользователей
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
CREATE INDEX IF NOT EXISTS idx_users_created_at ON users(created_at);
-- ========================================
-- ТАБЛИЦА ЗАКАЗОВ
-- ========================================
CREATE TABLE IF NOT EXISTS orders (
id SERIAL PRIMARY KEY,
order_number VARCHAR(20) UNIQUE NOT NULL,
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
total_amount DECIMAL(10,2) NOT NULL,
delivery_info JSONB, -- Хранит информацию о доставке
status VARCHAR(20) DEFAULT 'processing' CHECK (status IN ('processing', 'confirmed', 'shipped', 'delivered', 'cancelled')),
payment_status VARCHAR(20) DEFAULT 'pending' CHECK (payment_status IN ('pending', 'paid', 'failed', 'refunded')),
payment_method VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Индексы для заказов
CREATE INDEX IF NOT EXISTS idx_orders_user_id ON orders(user_id);
CREATE INDEX IF NOT EXISTS idx_orders_status ON orders(status);
CREATE INDEX IF NOT EXISTS idx_orders_created_at ON orders(created_at);
CREATE INDEX IF NOT EXISTS idx_orders_order_number ON orders(order_number);
-- ========================================
-- ТАБЛИЦА ТОВАРОВ В ЗАКАЗАХ
-- ========================================
CREATE TABLE IF NOT EXISTS order_items (
id SERIAL PRIMARY KEY,
order_id INTEGER REFERENCES orders(id) ON DELETE CASCADE,
product_model VARCHAR(100) NOT NULL,
product_name VARCHAR(255) NOT NULL,
product_price DECIMAL(10,2) NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity > 0),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Индексы для товаров в заказах
CREATE INDEX IF NOT EXISTS idx_order_items_order_id ON order_items(order_id);
CREATE INDEX IF NOT EXISTS idx_order_items_product_model ON order_items(product_model);
-- ========================================
-- ФУНКЦИИ ДЛЯ АВТОМАТИЧЕСКОГО ОБНОВЛЕНИЯ updated_at
-- ========================================
-- Функция для обновления поля updated_at
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- Триггеры для автоматического обновления
CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_orders_updated_at BEFORE UPDATE ON orders
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- ========================================
-- ПРИМЕРЫ ДАННЫХ
-- ========================================
-- Тестовый пользователь (password: password123)
INSERT INTO users (name, email, password_hash, phone)
VALUES ('Тест Пользователь', 'test@example.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '+7 (999) 123-45-67')
ON CONFLICT (email) DO NOTHING;
-- ========================================
-- ПРАВА ДОСТУПА (для production)
-- ========================================
-- Создание роли для веб-приложения
-- CREATE ROLE powerpc_app;
-- GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO powerpc_app;
-- GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO powerpc_app;
-- ========================================
-- ЗАМЕТКИ ПО ИСПОЛЬЗОВАНИЮ
-- ========================================
/*
ВЫПОЛНЕНИЕ СКРИПТА:
1. Создайте базу данных: createdb powerpc_db
2. Подключитесь к базе: psql powerpc_db
3. Выполните скрипт: \i database.sql
НАСТРОЙКА В PHP:
- Обновите параметры подключения в api/db_config.php
- Убедитесь, что расширение pdo_pgsql включено в PHP
БЕЗОПАСНОСТЬ:
- Измените пароль пользователя базы данных
- Создайте отдельного пользователя для приложения
- Настройте файрвол для порта 5432
*/