只是想知道如果在我的图书数据库中我有两个同名的作者会发生什么。我怎么能重新设计我的数据库来解决这个问题?我是否必须分配主键和辅助键?顺便说一句,这个问题与我之前的问题有关。
答案 0 :(得分:3)
您几乎应该始终使用自己的内部ID系统,即使它从未向您的用户显示过。在你的数据库中,每本书都有自己的'id'属性,你可以每次自动增加1。
除了您的问题中的示例之外,这样做的原因是,即使您使用看似唯一的标识符(如ISBN),此标准也可能(并且已经)在某个时间点发生变化,要更新数据库,还有很多工作要做。
答案 1 :(得分:3)
AUTHORS
表可以帮助您的图书数据库 - 您可以存储一次作者信息,但将其与多本图书相关联:
DROP TABLE IF EXISTS `example`.`authors`;
CREATE TABLE `example`.`authors` (
`author_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`firstname` varchar(45) NOT NULL,
`lastname` varchar(45) NOT NULL,
PRIMARY KEY (`author_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
书籍可以有多个作者,因此您需要一个多对多表来将作者与书籍联系起来:
DROP TABLE IF EXISTS `example`.`book_authors_map`;
CREATE TABLE `example`.`book_authors_map` (
`book_id` int(10) unsigned NOT NULL,
`author_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`book_id`,`author_id`),
KEY `FK_authors` (`author_id`),
CONSTRAINT `FK_books` FOREIGN KEY (`book_id`) REFERENCES `books` (`book_id`),
CONSTRAINT `FK_authors` FOREIGN KEY (`author_id`) REFERENCES `authors` (`author_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
答案 2 :(得分:1)
如果您有两个具有完全相同名称的不同作者,则每个作者都应具有某种唯一ID来区分它们,无论是GUID还是自动编号。
答案 3 :(得分:-2)
使用存在的自然键 - 在本例中为ISBN编号