4

外部キーを介して他の26のテーブルの1つに接続できる必要があるテーブルを持つInnoDBMySQLデータベースがあります。各レコードは、一度にこれら26のいずれかにのみ接続します。テーブルはおそらく10,000レコード以下で構成されます。これを行う別の方法はありますか?

-- -----------------------------------------------------
-- Table `db_mydb`.`tb_job`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db_mydb`.`tb_job` (
  `job_id` INT(11) NOT NULL AUTO_INCREMENT ,
  // Removed 26 other fields that the table requires

  `job_foreignkey_a_id` INT(11) NULL DEFAULT NULL ,
  `job_foreignkey_b_id` INT(11) NULL DEFAULT NULL ,
  `job_foreignkey_c_id` INT(11) NULL DEFAULT NULL ,
  // Removed the other 23 foreign keys fields that are the same

  PRIMARY KEY (`job_id`) ,

  CONSTRAINT `fka_tb_job_tb`
    FOREIGN KEY (`job_foreignkey_a_id` )
    REFERENCES `db_mydb`.`tb_foreignkey_a` (`foreignkey_a_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fkb_tb_job_tb`
    FOREIGN KEY (`job_foreignkey_b_id` )
    REFERENCES `db_mydb`.`tb_foreignkey_b` (`foreignkey_b_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fkc_tb_job_tb`
    FOREIGN KEY (`job_foreignkey_c_id` )
    REFERENCES `db_mydb`.`tb_foreignkey_c` (`foreignkey_c_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
  // Removed the other 23 foreign keys constraints that are the same

ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

CREATE INDEX `fka_tb_job_tb` ON `db_mydb`.`tb_job` (`job_foreignkey_a_id` ASC) ;
CREATE INDEX `fkb_tb_job_tb` ON `db_mydb`.`tb_job` (`job_foreignkey_b_id` ASC) ;
CREATE INDEX `fkc_tb_job_tb` ON `db_mydb`.`tb_job` (`job_foreignkey_c_id` ASC) ;
// Removed the other 23 foreign keys indexes that are the same
4

3 に答える 3

3

これは、MySQLやその友人がサポートしない傾向がある一般的な外部キーの問題です。これを行うには2つの方法があります。

1つ目は、これまでと同様に、すべてのタイプに1つずつ、null許容の外部キーです。

もう1つは、Djangoの場合と同様にContent Types、結合テーブルを使用することです。各行には、行IDと、検索するテーブルを指定するフィールドがあります。次に、フィールドの内容に応じて、コードでSQLクエリを作成する必要があります。うまく機能しますが、制限があります。

最初のものの欠点は肥大化ですが、それは通常のFKの利点、つまり参照整合性やSQL結合などをもたらします。どちらも非常に価値があります。2番目の方法では取得できません。

于 2013-01-04T14:57:25.597 に答える
1

外部キー制約を維持するかどうかによって異なりますが、キーまたはテーブルタイプによってテーブルの1つを参照する1つのテーブルを持つことができます。問題は、外部キーの制約が失われることです。もちろん、関数ベースの制約を作成できれば、それはあなたのために働くことができます。または、トリガーを使用して関係を強制することもできます。関数ベースの制約はmysqlでは使用できません。

于 2013-01-04T15:03:49.670 に答える
0

はい、できます。これらの2つのStackOverflowの回答は、わずかに異なるコンテキストでの基本的な原則を示しています。

MySQLを使用するには、重要なCHECK()制約を外部キー参照に置き換える必要があります。これはMySQLの最も一般的なケースでは機能しませんがこの特定のアプリケーションでは機能します。

これがあなたを動かすのに十分な情報ではない場合は、私にコメントを残してください、そして私はこの答えをもう少し拡大しようとします。

于 2013-01-04T15:35:15.197 に答える