【发布时间】:2017-07-27 11:31:39
【问题描述】:
我有一张桌子time。时间条目(1:n 关系)要么属于 project 条目,要么属于 special_work 条目。必须设置项目 id 或 special_work id,两者都不能(独占或)。
CREATE TABLE `time` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`project` int(20) NOT NULL,
`special_work` int(20) NOT NULL,
`date` date NOT NULL,
`hours` float NOT NULL,
`time_from` time DEFAULT NULL,
`time_to` time DEFAULT NULL,
`notes` text NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`project`) REFERENCES `project`(`id`)
FOREIGN KEY (`special_work`) REFERENCES `special_work`(`id`)
) DEFAULT CHARSET=utf8;
如何在 SQL 中编写此代码?除了触发器还有什么办法?
如果您确定这是糟糕的数据库设计 - 有没有更好的建模方法?但是我确实不想要两个不同的时间表。
我的数据库是 Mysql 5.5 InnoDB。
【问题讨论】:
-
您想要避免触发的原因是什么?如果只是出于好奇不用担心,如果是因为你被告知“触发器不好”,那有点不正确。有时触发器很糟糕;有时它们是可以接受的,具体取决于场景。这是可接受的场景之一。
-
MySQL 的 FK 很糟糕。即使使用不太蹩脚的 FK 实现,也无法解决所有问题。
标签: mysql sql database-design innodb mysql-5.5