编辑 - 基于以下回应,我将重新审视我的设计。我想我可以通过更加巧妙地阐述业务对象和规则来避免这种混乱。谢谢大家的帮助!外键关系和“属于很多”
-
我有以下模式:
S所属于到T
T具有许多小号
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,但我不清楚如何做到这一点(我会继续谷歌更多在这)
编辑 - 澄清,T只能属于A,B或C(等)之一,而不是两个A,也不是A和B(即是,它不是很多)。我的问题是关于如何在Yii框架模型中描述这种关系 - 例如(A,B,C,D,...)HAS_ONE T,T属于(A,B,C,D,.. )。从商业用例来看,这一切都是有道理的,但我不确定是否在数据库中正确设置了它,或者如果我这样做,我需要在Yii中使用“行为”来使其理解关系。 @rwmnau我明白你的意思,我希望我的澄清有所帮助。
UML: uml diagram 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;
你可以发布图表和/或DDL吗?很高兴看到它的外观。 – 2010-05-07 18:39:13
对我来说太抽象了。你可以发布示例表结构吗? – Oded 2010-05-07 18:39:38
我已经添加了图表和DDL,并希望澄清我的问题。 – jan 2010-05-07 19:15:27