000004_create_places.up.sql 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. CREATE TABLE places (
  2. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  3. type VARCHAR(10) NOT NULL CHECK (type IN ('place', 'studio')),
  4. owner_id UUID NOT NULL REFERENCES users(id),
  5. title VARCHAR(255) NOT NULL,
  6. description TEXT,
  7. address VARCHAR(500),
  8. coordinates GEOGRAPHY(Point, 4326) NOT NULL,
  9. cover_image TEXT,
  10. access_info TEXT,
  11. status VARCHAR(20) NOT NULL DEFAULT 'pending_moderation'
  12. CHECK (status IN ('draft', 'pending_moderation', 'published', 'rejected', 'archived')),
  13. moderation_comment TEXT,
  14. rating DECIMAL(2,1) DEFAULT 0,
  15. reviews_count INT DEFAULT 0,
  16. hourly_rate INT,
  17. currency VARCHAR(3) DEFAULT 'RUB',
  18. min_hours INT DEFAULT 1,
  19. booking_url TEXT,
  20. created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  21. updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  22. deleted_at TIMESTAMPTZ,
  23. published_at TIMESTAMPTZ
  24. );
  25. CREATE INDEX idx_places_coordinates ON places USING GIST (coordinates);
  26. CREATE INDEX idx_places_type ON places(type);
  27. CREATE INDEX idx_places_status ON places(status);
  28. CREATE INDEX idx_places_owner_id ON places(owner_id);
  29. CREATE INDEX idx_places_rating ON places(rating);
  30. CREATE INDEX idx_places_published_at ON places(published_at);
  31. CREATE TABLE place_images (
  32. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  33. place_id UUID NOT NULL REFERENCES places(id) ON DELETE CASCADE,
  34. url TEXT NOT NULL,
  35. alt VARCHAR(255),
  36. sort_order INT DEFAULT 0,
  37. is_cover BOOLEAN DEFAULT false,
  38. created_at TIMESTAMPTZ NOT NULL DEFAULT now()
  39. );
  40. CREATE INDEX idx_place_images_place_id ON place_images(place_id);
  41. CREATE TABLE place_tags (
  42. place_id UUID NOT NULL REFERENCES places(id) ON DELETE CASCADE,
  43. tag_id VARCHAR(50) NOT NULL REFERENCES tags(id),
  44. PRIMARY KEY (place_id, tag_id)
  45. );
  46. CREATE TABLE place_features (
  47. place_id UUID NOT NULL REFERENCES places(id) ON DELETE CASCADE,
  48. feature_id VARCHAR(50) NOT NULL REFERENCES features(id),
  49. PRIMARY KEY (place_id, feature_id)
  50. );