我有一张包含 3 列的表,其中存储了预订槽(bookID、bookedfrom、bookedfor)。还有一个存储用户凭据的表(crID、电子邮件、密码)。还有一个存储最终用户的第三张表(enduserID,name,lastname)
目的是 bookingslots 表的 bookingfrom 列引用凭证表的 crID 和 endusers 表的 enduserID。
所以我们有一个列分别引用两个表中的 2 列。
此外,最终用户表引用了凭证表。您看到的重点是,当站点的注册用户时,他们的凭据将保存在凭据表中,而其他数据(例如姓名和姓氏)将保存在最终用户表中-预订表中的预定来源 col 将引用凭证表中的 crID-...可以选择为非注册用户进行预订,这意味着凭证表中不会有任何条目,而只有最终用户表中的条目,因此从 col 预订还必须引用 andusers 表。
话虽这么说......我担心我们可能在预订槽表中出现插入异常,bookID 可能再次引用 6 的 crID 和 6 的 enduserID。
你怎么看?上述架构是否存在任何问题......就像提到的那样......这是sql代码:
CREATE TABLE IF NOT EXISTS `appointments`.`appointments` (
`AppointId` INT NOT NULL AUTO_INCREMENT ,
`bookedFrom` INT(11) NOT NULL ,
`bookedFor` INT(11) NOT NULL ,
PRIMARY KEY (`AppointId`) ,
UNIQUE INDEX `bookedFrom_UNIQUE` (`bookedFrom` ASC) ,
UNIQUE INDEX `bookedFor_UNIQUE` (`bookedFor` ASC) ,
CONSTRAINT `fk_appointments_credentials1`
FOREIGN KEY (`bookedFrom` )
REFERENCES `appointments`.`credentials` (`crID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_appointments_credentials2`
FOREIGN KEY (`bookedFor` )
REFERENCES `appointments`.`credentials` (`crID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_appointments_end_users1`
FOREIGN KEY (`bookedFrom` )
REFERENCES `appointments`.`end_users` (`crID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
CREATE TABLE IF NOT EXISTS `appointments`.`credentials` (
`crID` INT(11) NOT NULL AUTO_INCREMENT ,
`email` VARCHAR(255) NULL ,
`password` VARCHAR(100) NULL ,
`hash` VARCHAR(32) NULL ,
PRIMARY KEY (`crID`) ,
UNIQUE INDEX `email_UNIQUE` (`email` ASC) )
ENGINE = InnoDB
AUTO_INCREMENT = 2
DEFAULT CHARACTER SET = utf8
CREATE TABLE IF NOT EXISTS `appointments`.`end_users` (
crID` INT(11) NOT NULL AUTO_INCREMENT ,
name` VARCHAR(100) NULL DEFAULT NULL ,
lastname` VARCHAR(100) NULL DEFAULT NULL ,
PRIMARY KEY (`crID`) ,
CONSTRAINT `fk_end_users_credentials1`
FOREIGN KEY (`crID` )
REFERENCES `appointments`.`credentials` (`crID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8