-- Миграция для создания таблицы city_objects -- Файл: migrations/create_city_objects_table.sql -- Создание таблицы city_objects CREATE TABLE IF NOT EXISTS city_objects ( id SERIAL PRIMARY KEY, city_id INTEGER NOT NULL, name VARCHAR(255) NOT NULL DEFAULT '', model_url VARCHAR(500) NOT NULL, -- Позиция pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0, pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0, pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0, -- Поворот (в радианах) rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0, rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0, rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0, -- Масштаб scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1, scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1, scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1, -- Дополнительные свойства organization_id INTEGER NOT NULL DEFAULT 2, rent DECIMAL(10, 2) NOT NULL DEFAULT 0, tax DECIMAL(10, 2) NOT NULL DEFAULT 0, collidable BOOLEAN NOT NULL DEFAULT false, interior_id INTEGER NOT NULL DEFAULT 101, textures VARCHAR(500) NOT NULL DEFAULT '-', -- Метаданные created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- Внешние ключи CONSTRAINT fk_city_objects_city FOREIGN KEY (city_id) REFERENCES cities(id) ON DELETE CASCADE, CONSTRAINT fk_city_objects_organization FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE SET DEFAULT, CONSTRAINT fk_city_objects_interior FOREIGN KEY (interior_id) REFERENCES interiors(id) ON DELETE SET DEFAULT ); -- Создание индексов для оптимизации запросов CREATE INDEX IF NOT EXISTS idx_city_objects_city_id ON city_objects(city_id); CREATE INDEX IF NOT EXISTS idx_city_objects_organization_id ON city_objects(organization_id); CREATE INDEX IF NOT EXISTS idx_city_objects_interior_id ON city_objects(interior_id); CREATE INDEX IF NOT EXISTS idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z); CREATE INDEX IF NOT EXISTS idx_city_objects_collidable ON city_objects(collidable); -- Создание функции для автоматического обновления updated_at CREATE OR REPLACE FUNCTION update_city_objects_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ language 'plpgsql'; -- Создание триггера для автоматического обновления updated_at (только после создания таблицы) DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'city_objects') THEN DROP TRIGGER IF EXISTS update_city_objects_updated_at ON city_objects; CREATE TRIGGER update_city_objects_updated_at BEFORE UPDATE ON city_objects FOR EACH ROW EXECUTE FUNCTION update_city_objects_updated_at(); END IF; END $$; -- Комментарии к таблице и колонкам COMMENT ON TABLE city_objects IS 'Таблица объектов городов'; COMMENT ON COLUMN city_objects.id IS 'Уникальный идентификатор объекта'; COMMENT ON COLUMN city_objects.city_id IS 'ID города, к которому принадлежит объект'; COMMENT ON COLUMN city_objects.name IS 'Название объекта'; COMMENT ON COLUMN city_objects.model_url IS 'URL модели объекта'; COMMENT ON COLUMN city_objects.pos_x IS 'X координата позиции'; COMMENT ON COLUMN city_objects.pos_y IS 'Y координата позиции'; COMMENT ON COLUMN city_objects.pos_z IS 'Z координата позиции'; COMMENT ON COLUMN city_objects.rot_x IS 'X компонент поворота (радианы)'; COMMENT ON COLUMN city_objects.rot_y IS 'Y компонент поворота (радианы)'; COMMENT ON COLUMN city_objects.rot_z IS 'Z компонент поворота (радианы)'; COMMENT ON COLUMN city_objects.scale_x IS 'X компонент масштаба'; COMMENT ON COLUMN city_objects.scale_y IS 'Y компонент масштаба'; COMMENT ON COLUMN city_objects.scale_z IS 'Z компонент масштаба'; COMMENT ON COLUMN city_objects.organization_id IS 'ID организации-владельца'; COMMENT ON COLUMN city_objects.rent IS 'Стоимость аренды'; COMMENT ON COLUMN city_objects.tax IS 'Налог'; COMMENT ON COLUMN city_objects.collidable IS 'Имеет ли объект коллизию'; COMMENT ON COLUMN city_objects.interior_id IS 'ID интерьера объекта'; COMMENT ON COLUMN city_objects.textures IS 'Информация о текстурах'; COMMENT ON COLUMN city_objects.created_at IS 'Время создания записи'; COMMENT ON COLUMN city_objects.updated_at IS 'Время последнего обновления записи';