init.sql 4.6 KB

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