Files
rltn/migrations/create_city_objects_table.sql

95 lines
5.0 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Миграция для создания таблицы 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 'Время последнего обновления записи';