V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
aoscici2000
V2EX  ›  MySQL

mysql 外键设置和查询

  •  
  •   aoscici2000 · Jul 17, 2019 · 5219 views
    This topic created in 2477 days ago, the information mentioned may be changed or developed.
    
    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 显示

    16 replies    2019-07-18 09:08:56 +08:00
    Duolingo
        1
    Duolingo  
       Jul 17, 2019 via Android
    不要用外键
    连表查询
    aoscici2000
        2
    aoscici2000  
    OP
       Jul 17, 2019
    @codingadog 为何呢?
    gz911122
        3
    gz911122  
       Jul 17, 2019
    @aoscici2000 因为没啥必要..
    agdhole
        4
    agdhole  
       Jul 17, 2019
    不要用外键
    univ
        5
    univ  
       Jul 17, 2019
    为啥不用外键??不用外键两个表怎么关联???只是针对上面回答的一些疑惑。
    laravel
        6
    laravel  
       Jul 17, 2019
    一般不用外键约束,就是这个
    CONSTRAINT `author_fk` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`),
    CONSTRAINT `catalog_fk` FOREIGN KEY (`catalog_id`) REFERENCES `catalog` (`id`)
    LeeSeoung
        7
    LeeSeoung  
       Jul 17, 2019
    人为约定而不建立约束。。因为外键约束很容易出问题,外键一般推荐用唯一标志 id
    akira
        8
    akira  
       Jul 17, 2019   ❤️ 1
    刚学数据库吧,如果是考试,那就老老实实按着书本来做。如果是工作了,三范式什么的就赶紧扔了。

    1. 工作环境严重不建议用“ FOREIGN KEY ”, 直接做索引连表查询就好了。 更进一步的话,我们会把作者和分类的名字都冗余进文章表里面,这样直接单表就能出必要数据了。

    2. 典型 的 sql 的 left join 应用场景
    fhsan
        9
    fhsan  
       Jul 17, 2019
    如果不用外键,一定要有一套代码来检查逻辑,要不然就是作死。
    iwishing
        10
    iwishing  
       Jul 17, 2019
    看你数据量多少了
    有很多最佳实践提倡不要用外键,实际看你自己的需求。
    hailiang88
        11
    hailiang88  
       Jul 17, 2019
    外键可以保持数据一致性啊
    arthas2234
        12
    arthas2234  
       Jul 17, 2019
    1、关联 id
    2、关联查询,left join 搞定
    3、不要用外键
    SKull4
        13
    SKull4  
       Jul 17, 2019
    @akira #8 这算不算一种倒退
    haon
        14
    haon  
       Jul 17, 2019
    想知道大厂现在都抛弃外键了吗
    akira
        15
    akira  
       Jul 17, 2019
    @SKull4 怎么会,理论都是说的理想情况,现实情况和理论不符合的多了去了
    qsbaq
        16
    qsbaq  
       Jul 18, 2019
    不要用外键+1
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1053 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 76ms · UTC 18:43 · PVG 02:43 · LAX 11:43 · JFK 14:43
    ♥ Do have faith in what you're doing.