NULL значение в Relationship MySql

223
30 сентября 2018, 18:40

Имеется таблица:

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, как в было в основной таблице.

Что можно еще сделать что бы избежать второй таблицы?

Answer 1

Если чат действительно, создается изначально без оператора (что странно), то тогда логично будет убрать ограничение NOT NULL.

Если убирать не хочется, то можно завести служебного оператора, скажем, с ID = 0 и прописывать ссылку на этого оператора

Answer 2

NOT NULL надо убрать из поля operatorId. Тогда при вставке можно указывать значение NULL, после появления operatorId делать обновление.

READ ALSO
Запрет добавление в таблицу данных MariaDB

Запрет добавление в таблицу данных MariaDB

Суть: Если добавлять в таблицы moderators_products и subadmins_products записи, то возможна ситуация при которой один и тот же id из таблицы users будет соответствовать...

184
Как сверстать с помощью flex-box?

Как сверстать с помощью flex-box?

Есть такая разметка, можно ли без дополнительных оберток сделать это на флексбокс? Что должно получится прикрепляю изображением

285
Как оптимизировать обновление Dictionary в цикле foreach?

Как оптимизировать обновление Dictionary в цикле foreach?

Хочу оптимизировать - записать по другому эту часть кода:

221