2

まず、この質問の前に、私は本当にひどいデータ モデラーであると述べさせてください。私は危険なことだけを知っています。

作成中のテーブルには 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_userfk_reputation_log_user1です。すべてのレピュテーション イベントにはギバーがいますが、レシーバーがいるのは一部だけです。この FK を null 可能にしたいのですが、それを行う方法がわかりません。また、それが「許可」されているかどうかもわかりません。

また、すべての FK 列を主キーの一部にして、重複したログ エントリに対するデータベース レベルの保護を実現するというアイデアも考えましたが、PK 列は NOT NULL である必要があるため、これは機能しません。

詳細が必要な場合は、コメントにその旨を記載してください。ありがとう!

(はい、これは SO が持っているものとあまり似ていない評判システム用です)

4

1 に答える 1

4
CREATE  TABLE IF NOT EXISTS `abnr`.`reputation_event_log` (
  `id`                  INT NOT NULL AUTO_INCREMENT ,
  `reputation_event_id` INT NULL ,
  `giver_user_id`       INT NOT NULL , -- mandatory giver_user_id
  `receiver_user_id`    INT NULL ,     -- optional receiver_user_id
  . . .

はい、NULL列に外部キー制約が宣言されている可能性があります。列のNOT NULL制約は、その列の外部キー制約から独立しています。

外部キーとは、列に NULL 以外の値がある場合、その値が外部キー制約によって参照されるテーブルの主キーに存在する必要があることを意味します。

編集:要件については、null 許容列に制約をUNIQUE宣言できることを認識していますか。UNIQUE列には s含まれる場合がありますNULL(主キー制約とは異なります)。これは標準的な SQL の動作であり、MySQL でサポートされています。

  . . .
  PRIMARY KEY (`id`),
  CONSTRAINT UNIQUE (`giver_user_id`, `receiver_user_id`, 
                     `review_id`, `reputation_event_id`),
  . . .
于 2008-12-02T18:33:54.953 に答える