首先,让我先声明一下我真的是一个非常糟糕的数据建模师。我只知道危险。
我正在构建的表有四个外键,其中两个引用同一个表。这是该表的创建语句。
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 可以为空,但我不知道该怎么做,或者它是否被“允许”。
我还玩弄了将所有 FK 列作为主键的一部分以对重复日志条目进行数据库级保护的想法——但这不会起作用,因为 PK 列必须为 NOT NULL。
如果您需要更多详细信息,请在评论中说明。谢谢!
(是的,这是针对与 SO 没有太大不同的声誉系统)