编辑 - 根据下面的回复,我将重新审视我的设计。我认为我可以通过更聪明地设置业务对象和规则来避免这种混乱。感谢大家的帮助!
--
我有以下模型:
S属于T
T有很多S
A、B、C、D、E(等)各有 1 个 T,因此 T 应属于 A、B、C、D、E(等)中的每一个
起初我设置了我的外键,以便在 A 中,fk_a_t 将是 At 到 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(等)之一,而不是两个 A,也不是 A 和 B(也就是说,它不是多对多)。我的问题是关于如何在 Yii 框架模型中描述这种关系 - 例如, (A,B,C,D,...) HAS_ONE T ,并且 T 属于 (A,B,C,D,.. .)。从业务用例来看,这一切都是有道理的,但我不确定我是否在数据库中正确设置了它,或者如果我这样做了,我需要在 Yii 中使用“行为”来使其理解关系. @rwmnau 我明白你的意思,我希望我的澄清有所帮助。
这是 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;