編集-以下の回答に基づいて、デザインを再検討します。ビジネスオブジェクトとルールの設定方法をもう少し賢くすることで、この混乱を回避できると思います。皆さんの助けに感謝します!
-
私は次のモデルを持っています:
SはTに属します
TにはSがたくさんあります
A、B、C、D、E(etc)にはそれぞれ1つのTがあるため、TはA、B、C、D、E(etc)のそれぞれに属する必要があります。
最初に、Aではfk_a_tがAt to T(id)の外部キー、Bではfk_b_tなどになるように外部キーを設定しました。UMLではすべてが正常に見えますが(MySQLWorkBenchを使用)、 yiiモデルでは、Tには多くのA、B、C、D(など)があると考えられますが、これは私にとっては逆です。
A_T、B_T、C_T(など)のテーブルが必要なように思えますが、この関係にあるテーブルがたくさんあるので、これは面倒です。また、これを行うためのより良い方法は、A、B、C、D(など)がTとして動作できるような、ある種の動作であるとグーグルで調べましたが、これを行う方法が正確にはわかりません(私はこれについてもっとグーグルし続けます)
編集-明確にするために、TはA、B、またはC(など)の1つにのみ属することができ、2つのA、またはAとBには属せません(つまり、多対多ではありません)。私の質問は、Yiiフレームワークモデルでこの関係をどのように説明するかに関するものです。たとえば、(A、B、C、D、...)HAS_ONE Tであり、Tは(A、B、C、D、..に属します。 。)。ビジネスのユースケースからすると、これはすべて理にかなっていますが、データベースに正しく設定されているかどうか、または設定されている場合は、関係を理解するためにYiiの「動作」を使用する必要があるかどうかはわかりません。 。@rwmnau私はあなたが何を意味するのか理解しています、私の説明が役立つことを願っています。
これがDDL(自動生成)です。Tを参照するテーブルが3つ以上あると仮定してください。
-- -----------------------------------------------------
-- Table `mydb`.`T`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`T` (
`id` INT NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`S`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`S` (
`id` INT NOT NULL AUTO_INCREMENT ,
`thing` VARCHAR(45) NULL ,
`t` INT NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_S_T` (`id` ASC) ,
CONSTRAINT `fk_S_T`
FOREIGN KEY (`id` )
REFERENCES `mydb`.`T` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`A`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`A` (
`id` INT NOT NULL AUTO_INCREMENT ,
`T` INT NOT NULL ,
`stuff` VARCHAR(45) NULL ,
`bar` VARCHAR(45) NULL ,
`foo` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_A_T` (`T` ASC) ,
CONSTRAINT `fk_A_T`
FOREIGN KEY (`T` )
REFERENCES `mydb`.`T` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`B`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`B` (
`id` INT NOT NULL AUTO_INCREMENT ,
`T` INT NOT NULL ,
`stuff2` VARCHAR(45) NULL ,
`foobar` VARCHAR(45) NULL ,
`other` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_A_T` (`T` ASC) ,
CONSTRAINT `fk_A_T`
FOREIGN KEY (`T` )
REFERENCES `mydb`.`T` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`C`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`C` (
`id` INT NOT NULL AUTO_INCREMENT ,
`T` INT NOT NULL ,
`stuff3` VARCHAR(45) NULL ,
`foobar2` VARCHAR(45) NULL ,
`other4` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_A_T` (`T` ASC) ,
CONSTRAINT `fk_A_T`
FOREIGN KEY (`T` )
REFERENCES `mydb`.`T` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;