edit - Основываясь на ответах ниже, я собираюсь вернуться к своему дизайну. Я думаю, что могу избежать этого беспорядка, будучи немного более умным с тем, как я излагаю свои бизнес-объекты и правила. Спасибо всем за помощь!
-
У меня есть следующая модель:
S принадлежит T
T имеет много S
A, B, C, D, E (и т. Д.) Имеют по 1 T каждый, поэтому T должен принадлежать каждому из A, B, C, D, E (и т. Д.)
Сначала я настроил свои внешние ключи так, чтобы в 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, но я не совсем понимаю, как именно это сделать ( Я буду продолжать Google больше об этом)
РЕДАКТИРОВАТЬ - чтобы уточнить, что T может принадлежать только одному из A, или B, или C, (и т. Д.), Но не двум A, ни A и B (то есть это не много ко многим) , Мой вопрос касается того, как описать это отношение в моделях Yii Framework - например, (A, B, C, D, ...) HAS_ONE T, а T принадлежит (A, B, C, D, ..). .). С точки зрения бизнес-использования это все имеет смысл, но я не уверен, правильно ли я настроил его в базе данных, или, если я это сделаю, мне нужно использовать «поведение» в Yii, чтобы оно понимало взаимосвязь , @ rwmnau Я понимаю, что ты имеешь в виду, надеюсь, мои разъяснения помогут.
UML:
UML-диаграмма http://www.freeimagehosting.net/uploads/fd8efa2f1d.png
Вот DDL (сгенерированный автоматически). Просто представьте, что существует более 3 таблиц, ссылающихся на T.
-- -----------------------------------------------------
-- 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;