CREATE TABLE `author` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
)
CREATE TABLE `catalog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
)
CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT',
`catalog_id` int(11) NOT NULL COMMENT '目录 id',
`author_id` int(11) NOT NULL COMMENT '作者 id',
CONSTRAINT `author_fk` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`),
CONSTRAINT `catalog_fk` FOREIGN KEY (`catalog_id`) REFERENCES `catalog` (`id`)
)
如以上所示的三张表, 在 article 创建外键的时候, 一般是用 id 还是直接使用 name 的好(name 值可能经常会做出修改)?
如果外键用 id, 查询 article 怎么能让结果返回直接使用 name 显示
1
codingadog 2019-07-17 12:14:03 +08:00 via Android
不要用外键
连表查询 |
2
aoscici2000 OP @codingadog 为何呢?
|
3
gz911122 2019-07-17 13:06:15 +08:00
@aoscici2000 因为没啥必要..
|
4
agdhole 2019-07-17 13:13:23 +08:00
不要用外键
|
5
sunny2580839896 2019-07-17 13:37:04 +08:00
为啥不用外键??不用外键两个表怎么关联???只是针对上面回答的一些疑惑。
|
6
laravel 2019-07-17 13:41:58 +08:00
一般不用外键约束,就是这个
CONSTRAINT `author_fk` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`), CONSTRAINT `catalog_fk` FOREIGN KEY (`catalog_id`) REFERENCES `catalog` (`id`) |
7
LeeSeoung 2019-07-17 13:51:30 +08:00
人为约定而不建立约束。。因为外键约束很容易出问题,外键一般推荐用唯一标志 id
|
8
akira 2019-07-17 14:05:48 +08:00 1
刚学数据库吧,如果是考试,那就老老实实按着书本来做。如果是工作了,三范式什么的就赶紧扔了。
1. 工作环境严重不建议用“ FOREIGN KEY ”, 直接做索引连表查询就好了。 更进一步的话,我们会把作者和分类的名字都冗余进文章表里面,这样直接单表就能出必要数据了。 2. 典型 的 sql 的 left join 应用场景 |
9
fhsan 2019-07-17 14:10:57 +08:00
如果不用外键,一定要有一套代码来检查逻辑,要不然就是作死。
|
10
iwishing 2019-07-17 14:16:12 +08:00
看你数据量多少了
有很多最佳实践提倡不要用外键,实际看你自己的需求。 |
11
hailiang88 2019-07-17 14:26:00 +08:00
外键可以保持数据一致性啊
|
12
arthas2234 2019-07-17 14:41:56 +08:00
1、关联 id
2、关联查询,left join 搞定 3、不要用外键 |
14
haon 2019-07-17 16:39:06 +08:00
想知道大厂现在都抛弃外键了吗
|
16
qsbaq 2019-07-18 09:08:56 +08:00
不要用外键+1
|