CREATE TABLE IF NOT EXISTS customers ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS projects ( id BIGINT AUTO_INCREMENT PRIMARY KEY, customer_id BIGINT NOT NULL, name VARCHAR(255) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_projects_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE TABLE IF NOT EXISTS locations ( id BIGINT AUTO_INCREMENT PRIMARY KEY, customer_id BIGINT NOT NULL, name VARCHAR(255) NOT NULL, kind VARCHAR(64) NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_locations_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE TABLE IF NOT EXISTS lots ( id BIGINT AUTO_INCREMENT PRIMARY KEY, code VARCHAR(255) NOT NULL, description TEXT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uniq_lots_code (code) ); CREATE TABLE IF NOT EXISTS assets ( id BIGINT AUTO_INCREMENT PRIMARY KEY, project_id BIGINT NOT NULL, location_id BIGINT NULL, name VARCHAR(255) NOT NULL, vendor VARCHAR(255) NULL, model VARCHAR(255) NULL, vendor_serial VARCHAR(255) NOT NULL, asset_tag VARCHAR(255) NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_assets_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT fk_assets_location FOREIGN KEY (location_id) REFERENCES locations(id) ON DELETE SET NULL ON UPDATE CASCADE ); CREATE TABLE IF NOT EXISTS components ( id BIGINT AUTO_INCREMENT PRIMARY KEY, lot_id BIGINT NULL, vendor VARCHAR(255) NULL, model VARCHAR(255) NULL, vendor_serial VARCHAR(255) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_components_lot FOREIGN KEY (lot_id) REFERENCES lots(id) ON DELETE SET NULL ON UPDATE CASCADE ); CREATE TABLE IF NOT EXISTS installations ( id BIGINT AUTO_INCREMENT PRIMARY KEY, asset_id BIGINT NOT NULL, component_id BIGINT NOT NULL, installed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, removed_at TIMESTAMP NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_installations_asset FOREIGN KEY (asset_id) REFERENCES assets(id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT fk_installations_component FOREIGN KEY (component_id) REFERENCES components(id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX idx_assets_vendor_serial ON assets(vendor_serial); CREATE INDEX idx_components_vendor_serial ON components(vendor_serial); CREATE INDEX idx_installations_component_removed ON installations(component_id, removed_at); CREATE INDEX idx_projects_customer ON projects(customer_id); CREATE INDEX idx_assets_project ON assets(project_id); CREATE INDEX idx_assets_location ON assets(location_id); CREATE INDEX idx_components_lot ON components(lot_id);