001-initial-schema.sql 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. -- Миграция 001: Инициализация основной схемы базы данных
  2. -- Автор: PhotoPlaces Team
  3. -- Дата: 2025-12-04
  4. BEGIN;
  5. -- Создание расширения PostGIS для работы с геоданными
  6. CREATE EXTENSION IF NOT EXISTS postgis;
  7. -- Таблица пользователей системы
  8. CREATE TABLE users (
  9. id SERIAL PRIMARY KEY,
  10. email VARCHAR(255) UNIQUE NOT NULL,
  11. password_hash VARCHAR(255) NOT NULL,
  12. first_name VARCHAR(100) NOT NULL,
  13. last_name VARCHAR(100) NOT NULL,
  14. role VARCHAR(20) NOT NULL CHECK (role IN ('superadmin', 'moderator', 'landlord', 'performer', 'customer', 'guest')),
  15. is_verified BOOLEAN DEFAULT FALSE,
  16. created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  17. updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
  18. );
  19. COMMENT ON TABLE users IS 'Таблица пользователей системы с различными ролями';
  20. COMMENT ON COLUMN users.role IS 'Роль пользователя: superadmin, moderator, landlord, performer, customer, guest';
  21. -- Таблица мест для фотосессий
  22. CREATE TABLE places (
  23. id SERIAL PRIMARY KEY,
  24. title VARCHAR(255) NOT NULL,
  25. description TEXT,
  26. location GEOGRAPHY(Point, 4326) NOT NULL,
  27. address TEXT,
  28. type VARCHAR(20) NOT NULL CHECK (type IN ('place', 'studio')),
  29. owner_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
  30. is_approved BOOLEAN DEFAULT FALSE,
  31. rating DECIMAL(3,2) DEFAULT 0.00,
  32. price_per_hour DECIMAL(10,2),
  33. max_capacity INTEGER,
  34. amenities JSONB,
  35. tags VARCHAR(255)[],
  36. created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  37. updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
  38. );
  39. COMMENT ON TABLE places IS 'Таблица мест для фотосессий с геометрическими координатами';
  40. COMMENT ON COLUMN places.location IS 'Географические координаты места в формате WGS84';
  41. COMMENT ON COLUMN places.type IS 'Тип места: place (место) или studio (студия)';
  42. -- Таблица изображений мест
  43. CREATE TABLE place_images (
  44. id SERIAL PRIMARY KEY,
  45. place_id INTEGER REFERENCES places(id) ON DELETE CASCADE,
  46. image_url VARCHAR(500) NOT NULL,
  47. is_primary BOOLEAN DEFAULT FALSE,
  48. uploaded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
  49. );
  50. COMMENT ON TABLE place_images IS 'Таблица изображений для мест';
  51. -- Таблица услуг фотографов
  52. CREATE TABLE services (
  53. id SERIAL PRIMARY KEY,
  54. performer_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
  55. title VARCHAR(255) NOT NULL,
  56. description TEXT,
  57. price DECIMAL(10,2) NOT NULL,
  58. duration_hours INTEGER,
  59. style_tags VARCHAR(255)[],
  60. rating DECIMAL(3,2) DEFAULT 0.00,
  61. is_available BOOLEAN DEFAULT TRUE,
  62. created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  63. updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
  64. );
  65. COMMENT ON TABLE services IS 'Таблица услуг фотографов';
  66. -- Таблица бронирований
  67. CREATE TABLE bookings (
  68. id SERIAL PRIMARY KEY,
  69. place_id INTEGER REFERENCES places(id) ON DELETE CASCADE,
  70. customer_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
  71. start_time TIMESTAMP WITH TIME ZONE NOT NULL,
  72. end_time TIMESTAMP WITH TIME ZONE NOT NULL,
  73. total_price DECIMAL(10,2) NOT NULL,
  74. status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'confirmed', 'cancelled', 'completed')),
  75. created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  76. updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
  77. );
  78. COMMENT ON TABLE bookings IS 'Таблица бронирований мест';
  79. -- Создание индексов для оптимизации запросов
  80. CREATE INDEX idx_places_location ON places USING GIST(location);
  81. CREATE INDEX idx_places_type ON places(type);
  82. CREATE INDEX idx_places_approved ON places(is_approved);
  83. CREATE INDEX idx_users_role ON users(role);
  84. CREATE INDEX idx_bookings_dates ON bookings(start_time, end_time);
  85. CREATE INDEX idx_services_performer ON services(performer_id);
  86. CREATE INDEX idx_place_images_place ON place_images(place_id);
  87. -- Функция для автоматического обновления updated_at
  88. CREATE OR REPLACE FUNCTION update_updated_at_column()
  89. RETURNS TRIGGER AS $$
  90. BEGIN
  91. NEW.updated_at = CURRENT_TIMESTAMP;
  92. RETURN NEW;
  93. END;
  94. $$ language 'plpgsql';
  95. -- Триггеры для автоматического обновления updated_at
  96. CREATE TRIGGER update_users_updated_at
  97. BEFORE UPDATE ON users
  98. FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
  99. CREATE TRIGGER update_places_updated_at
  100. BEFORE UPDATE ON places
  101. FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
  102. CREATE TRIGGER update_services_updated_at
  103. BEFORE UPDATE ON services
  104. FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
  105. CREATE TRIGGER update_bookings_updated_at
  106. BEFORE UPDATE ON bookings
  107. FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
  108. COMMIT;
  109. -- Комментарий к миграции
  110. COMMENT ON MIGRATION 001 IS 'Инициализация основной схемы базы данных с таблицами пользователей, мест, услуг и бронирований';