-- +migrate Up CREATE TABLE photos ( id SERIAL PRIMARY KEY, title VARCHAR(200) NOT NULL, description TEXT, filename VARCHAR(255) NOT NULL, original_url VARCHAR(500) NOT NULL, thumbnail_url VARCHAR(500), medium_url VARCHAR(500), large_url VARCHAR(500), file_size BIGINT, mime_type VARCHAR(100), width INTEGER, height INTEGER, camera_make VARCHAR(100), camera_model VARCHAR(100), lens_model VARCHAR(100), focal_length DECIMAL(5,2), aperture DECIMAL(3,1), shutter_speed VARCHAR(20), iso INTEGER, taken_at TIMESTAMP, location_name VARCHAR(200), latitude DECIMAL(10,8), longitude DECIMAL(11,8), user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, album_id INTEGER, category_id INTEGER, is_public BOOLEAN DEFAULT true, is_featured BOOLEAN DEFAULT false, view_count INTEGER DEFAULT 0, like_count INTEGER DEFAULT 0, download_count INTEGER DEFAULT 0, sort_order INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMP ); -- 创建索引 CREATE INDEX idx_photos_user_id ON photos(user_id); CREATE INDEX idx_photos_album_id ON photos(album_id); CREATE INDEX idx_photos_category_id ON photos(category_id); CREATE INDEX idx_photos_is_public ON photos(is_public); CREATE INDEX idx_photos_is_featured ON photos(is_featured); CREATE INDEX idx_photos_taken_at ON photos(taken_at); CREATE INDEX idx_photos_created_at ON photos(created_at); CREATE INDEX idx_photos_view_count ON photos(view_count); CREATE INDEX idx_photos_like_count ON photos(like_count); CREATE INDEX idx_photos_sort_order ON photos(sort_order); CREATE INDEX idx_photos_deleted_at ON photos(deleted_at) WHERE deleted_at IS NOT NULL; -- 地理位置索引 CREATE INDEX idx_photos_location ON photos(latitude, longitude) WHERE latitude IS NOT NULL AND longitude IS NOT NULL; -- 添加更新时间触发器 CREATE TRIGGER update_photos_updated_at BEFORE UPDATE ON photos FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- +migrate Down DROP TRIGGER IF EXISTS update_photos_updated_at ON photos; DROP TABLE IF EXISTS photos;