Имеется таблица:
CREATE TABLE `chat` (
`id` BIGINT(6) NOT NULL AUTO_INCREMENT,
`siteId` BIGINT(6) NOT NULL,
`clientId` BIGINT(6) NOT NULL,
`operatorId` BIGINT(6) NOT NULL,
`guest` TINYINT(1) NULL DEFAULT 1,
`theme` VARCHAR(255) NULL,
`name` VARCHAR(255) NULL,
`complete` TINYINT(1) NULL DEFAULT 0,
`created` TIMESTAMP(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`, `siteId`, `clientId`, `operatorId`),
INDEX `fk_chat_site_idx` (`siteId` ASC),
INDEX `fk_chat_client1_idx` (`clientId` ASC),
INDEX `fk_chat_user1_idx` (`operatorId` ASC),
CONSTRAINT `fk_chat_site`
FOREIGN KEY (`siteId`)
REFERENCES `site` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_chat_client1`
FOREIGN KEY (`clientId`)
REFERENCES `client` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_chat_user1`
FOREIGN KEY (`operatorId`)
REFERENCES `user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Штука в том что привязка по полю operaotrId при создании записи в таблице будет NULL, то бишь чат изначально создается без оператора ну и как следствие запись не вставится. Убрать у поля NOT NULL мне кажется не совсем правильным. или это не так?
Из-за этого я сделал такую табличку, соответственно основная таблица без поля operatorId.
CREATE TABLE IF NOT EXISTS `chatOperator` (
`id` INT NOT NULL AUTO_INCREMENT,
`chatId` BIGINT(6) NOT NULL,
`userId` BIGINT(6) NOT NULL,
`created` TIMESTAMP(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`, `chatId`, `userId`),
INDEX `fk_table1_chat1_idx` (`chatId` ASC),
INDEX `fk_chatOperator_user1_idx` (`userId` ASC),
CONSTRAINT `fk_table1_chat1`
FOREIGN KEY (`chatId`)
REFERENCES `chat` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_chatOperator_user1`
FOREIGN KEY (`userId`)
REFERENCES `user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Но мне не очень нравится это т.к. в коде энтити есть поле operatorId, как в было в основной таблице.
Что можно еще сделать что бы избежать второй таблицы?
Если чат действительно, создается изначально без оператора (что странно), то тогда логично будет убрать ограничение NOT NULL.
Если убирать не хочется, то можно завести служебного оператора, скажем, с ID = 0 и прописывать ссылку на этого оператора
NOT NULL надо убрать из поля operatorId. Тогда при вставке можно указывать значение NULL, после появления operatorId делать обновление.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости