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