まず、この質問の前に、私は本当にひどいデータ モデラーであると述べさせてください。私は危険なことだけを知っています。
作成中のテーブルには 4 つの外部キーがあり、そのうちの 2 つは同じテーブルを参照しています。そのテーブルの create ステートメントを次に示します。
CREATE TABLE IF NOT EXISTS `abnr`.`reputation_event_log` (
`id` INT NOT NULL AUTO_INCREMENT ,
`reputation_event_id` INT NULL ,
`giver_user_id` INT NULL ,
`receiver_user_id` INT NULL ,
`review_id` INT NULL ,
`giver_point_value` SMALLINT NULL DEFAULT 0 ,
`receiver_point_value` SMALLINT NULL DEFAULT 0 ,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`) ,
INDEX `fk_reputation_log_user` (`giver_user_id` ASC) ,
INDEX `fk_reputation_log_user1` (`receiver_user_id` ASC) ,
INDEX `fk_reputation_log_review` (`review_id` ASC) ,
INDEX `fk_reputation_log_reputation_event` (`reputation_event_id` ASC) ,
CONSTRAINT `fk_reputation_log_user`
FOREIGN KEY (`giver_user_id` )
REFERENCES `abnr`.`user` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_reputation_log_user1`
FOREIGN KEY (`receiver_user_id` )
REFERENCES `abnr`.`user` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_reputation_log_review`
FOREIGN KEY (`review_id` )
REFERENCES `abnr`.`review` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_reputation_log_reputation_event`
FOREIGN KEY (`reputation_event_id` )
REFERENCES `abnr`.`reputation_event` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
この記事で気になるインデックスはfk_reputation_log_user
とfk_reputation_log_user1
です。すべてのレピュテーション イベントにはギバーがいますが、レシーバーがいるのは一部だけです。この FK を null 可能にしたいのですが、それを行う方法がわかりません。また、それが「許可」されているかどうかもわかりません。
また、すべての FK 列を主キーの一部にして、重複したログ エントリに対するデータベース レベルの保護を実現するというアイデアも考えましたが、PK 列は NOT NULL である必要があるため、これは機能しません。
詳細が必要な場合は、コメントにその旨を記載してください。ありがとう!
(はい、これは SO が持っているものとあまり似ていない評判システム用です)