編輯 - 基於以下回應,我將重新審視我的設計。我想我可以通過更加巧妙地闡述業務對象和規則來避免這種混亂。謝謝大家的幫助!外鍵關係和「屬於很多」
-
我有以下模式:
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