数据库的主键字段名叫`ID`不香么,为什么非要`table 名+ID`、`table 名缩写+ID`? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
luxinfl
V2EX    程序员

数据库的主键字段名叫`ID`不香么,为什么非要`table 名+ID`、`table 名缩写+ID`?

  •  
  •   luxinfl 2020-09-22 15:53:08 +08:00 15159 次点击
    这是一个创建于 1845 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大佬们的主键字段名是怎么定义的?难道不叫 ID 还会有什么好处么??

    第 1 条附言    2020-09-22 17:59:08 +08:00
    但是我们好像从来不用 id 当查询条件和关联条件,我们一般都是有个某个 code 字段,带有日期、业务的标识号当关联。所以 ID 就叫 ID 好了。有些时候,想查某个表最新的一条数据,我一般都是 select * from xxx order by id desc limit 1,结果就是 id 不存在。。。。
    115 条回复    2020-10-01 16:13:10 +08:00
    1  2  
    kiracyan
        1
    kiracyan  
       2020-09-22 15:55:27 +08:00
    语义更明确吧
    alexmao
        2
    alexmao  
       2020-09-22 15:55:52 +08:00   1
    当你有 10 个表的时候,都叫`ID`你记得过来吗?
    laravel
        3
    laravel  
       2020-09-22 15:57:21 +08:00
    我合作的小伙连 id 都没有
    lichao
        4
    lichao  
       2020-09-22 15:57:43 +08:00   5
    还有类似的,表名用 t_User, t_Customer
    wangyzj
        5
    wangyzj  
       2020-09-22 15:58:40 +08:00
    @laravel #3 又看到这个 id 了
    islxyqwe
        6
    islxyqwe  
       2020-09-22 16:00:11 +08:00
    有外键查询时键名能统一
    luxinfl
        7
    luxinfl  
    OP
       2020-09-22 16:00:52 +08:00
    @alexmao 你说的 10 个表什么场景?写查询 sql ?用别名不行麽?
    qq292382270
        8
    qq292382270  
       2020-09-22 16:01:31 +08:00
    表多了好认
    Rwing
        9
    Rwing  
       2020-09-22 16:01:33 +08:00
    是的,我觉得没必要,楼上说的 t_前缀也没必要,当初提出 t_前缀时是为了区分 view 和 sp,现在都不用了
    luxinfl
        10
    luxinfl  
    OP
       2020-09-22 16:02:33 +08:00
    @islxyqwe 可是我们不用 id 当做外键关联,我们都是用表里面定义的唯一业务编号 code 关联
    luxinfl
        11
    luxinfl  
    OP
       2020-09-22 16:04:27 +08:00
    @qq292382270 我们不用 id 关联,所以我是选择性忽略了麽
    tabris17
        12
    tabris17  
       2020-09-22 16:04:57 +08:00
    @alexmao 都叫 id 为什么会记不住?你想表达的是不宜区分吧,t1.id AS t1_id 不可以吗?
    wd
        13
    wd  
       2020-09-22 16:07:57 +08:00 via iPhone
    比较下 where t1.id = t2.user_id 和 where t1.user_id = t2.user_id
    lichao
        14
    lichao  
       2020-09-22 16:10:23 +08:00   19
    @wd

    当然是 where user.id = topic.user_id 好
    qwerthhusn
        15
    qwerthhusn  
       2020-09-22 16:15:26 +08:00
    xxx 对象,表名 xxx,字段名 xxx_id xxx_name xxx_???

    这样做,一个是有些属性像 order name status 这些可能是 DB 的关键字,有时候工具或者代码高亮显示的很奇怪,但是基本上不报错
    另外一个原因就是表连接的时候,两个表可能有一样的字段,需要表(别)名点字段(当然平常也应该加上别名)
    ztxcccc
        16
    ztxcccc  
       2020-09-22 16:17:21 +08:00   2
    user 表如果主键叫 user_id,topic 表里的用户字段就该叫 topic_user_id,这么写 SQL 不反人类?
    ColinZeb
        17
    ColinZeb  
       2020-09-22 16:22:03 +08:00
    @wd 又不是代码生成器,为什么叫 t1t2,user 可以简写 u,topic 简写 t,所以就是 u.id = t.userid
    baobao1270
        18
    baobao1270  
       2020-09-22 16:22:52 +08:00
    叫 ID:ORM 自动映射
    不叫:手写 SQL 连表查询方便

    看你是手写 SQL 还是用 ORM 咯
    u6pM63mMZ34z32cE
        19
    u6pM63mMZ34z32cE  
       2020-09-22 16:26:37 +08:00
    科普一下, SQL 有个 AS 关键词
    THESDZ
        20
    THESDZ  
       2020-09-22 16:28:35 +08:00   1
    当然没必要了,开发了 n 个项目,直接 ID,root-class,反而开发效率更高,封装起来更容易,前端对接也不用关心,缩写啊什么的臭毛病
    yogogo
        21
    yogogo  
       2020-09-22 16:28:48 +08:00   1
    谁设计的听谁的,背锅也不会是你
    THESDZ
        22
    THESDZ  
       2020-09-22 16:31:21 +08:00
    @alexmao 你难道用字段的时候不用表?想学习下这样的业务场景
    alexmao
        23
    alexmao  
       2020-09-22 16:35:16 +08:00
    @THESDZ 用表是用表,但是如果能区分,为什么不区分呢?多一点信息不是更加明确吗?
    THESDZ
        24
    THESDZ  
       2020-09-22 16:37:18 +08:00   1
    @alexmao 既然用了表,`table.id` 和 `table.table_id`,你非要选后者,理由是语义更清晰?
    alexmao
        25
    alexmao  
       2020-09-22 16:39:08 +08:00
    @THESDZ 在一个表里叫 id,另一个表里放这个 id 的时候叫 table_id,不觉得很不规整吗?
    netnr
        26
    netnr  
       2020-09-22 16:40:37 +08:00
    个人强烈推荐字段按表统一加前缀
    jintianfengda
        27
    jintianfengda  
       2020-09-22 16:41:26 +08:00 &nsp; 2
    关注,我个人是倾向主键就叫 id
    linxl
        28
    linxl  
       2020-09-22 16:41:55 +08:00
    只要项目里统一口径就行, 各有好处吧.
    除了 id, 还有很多其他单词也是很高频的字段名, 难道都要加上 table 名吗
    libracloud
        29
    libracloud  
       2020-09-22 16:44:30 +08:00
    用 rails 习惯后,我什么都是按 rails 的来的
    THESDZ
        30
    THESDZ  
       2020-09-22 16:44:50 +08:00   1
    @alexmao
    1. 不觉得,规整应该指的是同一套标准,而非同一个名字.
    2. 顺带:良好的代码应该简介的同时可以自解释,`ID`在当前表就是主键,没人看不懂,而`USER_ID`明显就是`USER`表的主键
    3. `ID`一般都没有业务含义,统一的好处是在处理统一的非业务逻辑的时候,不需要考虑一些异化的问题,从我有限的开发经验中,我认为全部使用`ID`效率更高.
    chendy
        31
    chendy  
       2020-09-22 16:49:17 +08:00   1
    自己的 id 就叫 id,关联到别人的字段叫 xxx_id
    其实怎么叫不是很重要,主要还是要有统一的命名规范
    zhaokun
        32
    zhaokun  
       2020-09-22 16:51:46 +08:00
    我们更奇葩
    主键用 pk_表名全称
    外键用 fk_表名全称
    定这规则的人说是 10 年高德地图的都这么用,现在是 2020 年了
    NO9527
        33
    NO9527  
       2020-09-22 16:53:50 +08:00
    喜欢 ID
    当一个 table 很长的适合,取一个很长的 table_id 感觉不舒服
    crist
        34
    crist  
       2020-09-22 17:02:04 +08:00
    我天王老子来了我也直接叫它 id !
    sonxzjw
        35
    sonxzjw  
       2020-09-22 17:05:02 +08:00
    貌似表名+id 的命名方法很早很早了吧,不过很早很早之前我就只用 id 了

    也符合命名简单明了的规范(当然这是单表角度)

    但是多表角度的话都会有 表明.字段名,so 个人觉得还是 id 合适
    tadebao
        36
    tadebao  
       2020-09-22 17:07:13 +08:00
    @lichao 这种用法遗传自以前的虚拟主机时代 一个 MySQL 库 跑多个应用 在表名上加前缀来区分
    dr1q65MfKFKHnJr6
        37
    dr1q65MfKFKHnJr6  
       2020-09-22 17:08:36 +08:00
    记得 powerdesinger 里面建模,默认检查有效性的时候,不同表相同名字的字段是有警告
    gaorenhua
        38
    gaorenhua  
       2020-09-22 17:10:59 +08:00
    可能是多表联查的时候,可以直接撸,不用担心字段冲突?也不用用 tableA.id as Aid 来多写几行?
    woodensail
        39
    woodensail  
       2020-09-22 18:03:40 +08:00
    我看了下,好像没人提逻辑主键和业务主键的区分。
    说白了楼主是用逻辑主键的,所以主键不参与关联,是个无意义字段,自然一个 id 就行。
    而楼里面提倡「 table 名+id 」的则是用业务主键,主键中包含表名易于关联。

    所以无所谓对错,只是逻辑主键和业务主键两种不同的习惯而已。
    whx20202
        40
    whx20202  
       2020-09-22 18:10:13 +08:00
    就叫 id,没什么问题,多表关联时候带上表名就行了
    draguo
        41
    draguo  
       2020-09-22 18:18:29 +08:00
    直接用 id 吧,我 orm 用的多,用其他字段得手动指定,带表名也就联查方便了一点点
    OneMan
        42
    OneMan  
       2020-09-22 18:22:35 +08:00
    规矩问题,非原则问题,没什么大不了和讨论的,看什么菜下什么锅即可
    MarioLuo
        43
    MarioLuo  
       2020-09-22 18:39:37 +08:00 via Android
    目前感觉唯一有用的地方 select xxx_name, yyy_name ...join a.xxx_id=b.yyy_id,个人倾向不加前缀,毕竟谁不使用 ORM 了
    tsingke
        44
    tsingke  
       2020-09-22 21:01:35 +08:00
    差别是不大,但是 id 省事好用,完胜嗦的 xxx_id,当然用 id,不会真有人用 xxx_id 吧,正经人谁用 xxx_id 是吧?
    dayFvckingByte
        45
    dayFvckingByte  
       2020-09-22 21:06:59 +08:00 via iPhone
    统一叫”ID 不香么”
    lin07hui
        46
    lin07hui  
       2020-09-22 21:22:17 +08:00
    多表查询时,字段可以不用 AS 。他可能不知道 AS 的存在,也可能他就是看不起 AS 。
    RickyC
        47
    RickyC  
       2020-09-22 21:24:48 +08:00
    @alexmao a.id, b.id 不香吗?
    RickyC
        48
    RickyC  
       2020-09-22 21:27:33 +08:00
    世界从来不是有序的, 而是从无序中寻找有序, 人们将这称为"劳动".
    littlewing
        49
    littlewing  
       2020-09-22 21:33:50 +08:00
    自增主键 id 应该是一个和业务无关的字段,所以叫 id 就好
    jorneyr
        50
    jorneyr  
       2020-09-22 21:57:08 +08:00
    平时用 id 或者 table_name_id 选一个就好了,但考虑分库分表时,使用 table_name_id,作为 sharding key 会比较好用
    gadsavesme
        51
    gadsavesme  
       2020-09-22 22:55:58 +08:00
    就是在关联表里看起来舒服点吧,不然主表叫 id,关联子表里叫 xxid,语义上不是很友好
    akira
        52
    akira  
       2020-09-22 23:03:12 +08:00
    叫 id,自增,不参与任何业务
    ZXCDFGTYU
        53
    ZXCDFGTYU  
       2020-09-22 23:24:08 +08:00
    user: id,username,pwd,salt
    ZXCDFGTYU
        54
    ZXCDFGTYU  
       2020-09-22 23:26:01 +08:00
    @ZXCDFGTYU user_info: id, user_id,phone

    id 每个表的 id 为 pk,table+_id 为关联字段 id,我个人习惯感觉还好,如果要是表名太长的话,可以用其他意思相近的英文单词替代。这样的话,能够单看 field 就能知道这个字段关联的哪个表,更方便一点。
    ZXCDFGTYU
        55
    ZXCDFGTYU  
       2020-09-22 23:27:30 +08:00
    楼上说的单独的关联表也可以,user_info_rel,table1+table2+_rel,字段里就是 user_id ( user.id ),user_info_id(user_info.id)。
    ZXCDFGTYU
        56
    ZXCDFGTYU  
       2020-09-22 23:27:47 +08:00
    以上为个人习惯
    songco
        57
    songco  
       2020-09-22 23:41:16 +08:00 via iPhone
    同一个项目统一风格就好

    真码农有能力制定项目命名规则,就按自己偏好来,自己制定不了,学会适应

    现代编辑器比较先进,各种风格差别不大
    lithiumii
        58
    lithiumii  
       2020-09-22 23:56:28 +08:00 via Android
    这么喜欢统一主键名,mongodb 欢迎你
    lululau
        59
    lululau  
       2020-09-23 09:08:53 +08:00 via iPhone   2
    别争了,本表主键名称以加表名作前缀的就是沙雕行为,没有任何好处
    qiumaoyuan
        60
    qiumaoyuan  
       2020-09-23 09:10:05 +08:00
    讨论技术问题最烦“规整”、“太重”、“奇怪”这类不明所以的形容词,我 TM 都不知道这些人到底在说啥,标准都让你定了,别人讨论个尖儿。
    whenwind
        61
    whenwind  
       2020-09-23 09:15:38 +08:00   1
    tp 连表查询重名的会哭死
    h82258652
        62
    h82258652  
       2020-09-23 09:20:28 +08:00
    都叫 id,不然用 orm 还得去配列名映射。
    hbolive
        63
    hbolive  
       2020-09-23 09:37:07 +08:00
    统一叫 id,主键自增,没有觉得不方便或者有混淆的地方
    SAnii
        64
    SAnii  
       2020-09-23 09:37:26 +08:00
    遇到项目里表特别多联查的时候,有前缀就很方便清晰明了.
    sambawy
        65
    sambawy  
       2020-09-23 09:37:46 +08:00
    爱怎么用就怎么用,都没错,风格统一就完事了
    darknoll
        66
    darknoll  
       2020-09-23 09:41:50 +08:00
    我就叫 id,谁不服谁自己写
    fpure
        67
    fpure  
       2020-09-23 09:42:34 +08:00
    这样连表查询的时候很直观,一眼就知道连哪张表哪个字段
    Outshine
        68
    Outshine  
       2020-09-23 09:43:33 +08:00
    当前表的主键就叫 ID 啊,外键才会带上表名,比如文章表的用户 ID 就叫 user_id 或者 creator_id
    主键带当前表的表名就很沙雕(还有表前缀)
    zhuweiyou
        69
    zhuweiyou  
       2020-09-23 09:49:27 +08:00
    当前表 id, 其他表 xxx_id
    zppass
        70
    zppass  
       2020-09-23 09:51:09 +08:00
    擦,刚想说点啥,发现自己项目中的也是用 ID,如果不是关键字什么的其实应该没多大问题,像什么 ISXXX 之类的尽量不要用,有的框架会解析错误,表名啥的尽量能做到见词知意。
    guanhui07
        71
    guanhui07  
       2020-09-23 10:00:06 +08:00   1
    我个人是倾向主键就叫 id, 查询可以别名 as
    greg0220
        72
    greg0220  
       2020-09-23 10:01:25 +08:00 via iPhone
    我们使用的 id 。但是感觉这个字段除了唯一性没什么其他用处了。
    xpol
        73
    xpol  
       2020-09-23 10:04:45 +08:00 via iPhone
    我司基本上有 id 列,但不用。额外添加一列名曰 code 或者表名+code 。字符串类型,值是缩写加数字。手动实现一个后面的数字的自增。
    zhuyichen1017
        74
    zhuyichen1017  
       2020-09-23 10:05:54 +08:00
    听领导说是百度先带出来的
    0bit
        75
    0bit  
       2020-09-23 10:06:09 +08:00
    主键不叫 id 的都是异教徒
    alexmao
        76
    alexmao  
       2020-09-23 10:12:27 +08:00
    照你们这么说,user_name, artical_name, category_name,都叫 name 得了?反正 sql 的时候都带着表名。
    7654
        77
    7654  
       2020-09-23 10:15:20 +08:00
    前人栽树后人乘凉,前人挖坑后人遭殃
    ritaswc
        78
    ritaswc  
       2020-09-23 10:18:23 +08:00
    我觉得 id 好用啊,每次在 Orm 里面用到主键的时候,还要想一下是什么。八成设计表的人害怕 join 的时候主键冲突吧,笑
    Still4
        79
    Still4  
       2020-09-23 10:20:56 +08:00
    user_info: id, name, company_id, phone_id
    company_info: id, name
    company_structure: company_id, user_id, user_level
    phone_info: id, name
    联表一查,喵喵喵?
    nutting
        80
    nutting  
       2020-09-23 10:29:15 +08:00
    @zhaokun 这个好像是阿里规范也是这样的
    lazing
        81
    lazing  
       2020-09-23 10:31:58 +08:00
    有契约其实比较好。
    比如 主表 primary.id 外键就叫 other.primary_id
    主表是 table.code,外键 table_code
    id 用 bigint code 用 varchar
    THESDZ
        82
    THESDZ  
       2020-09-23 10:34:09 +08:00
    jasonding
        83
    jasonding  
       2020-09-23 10:36:28 +08:00
    主表就叫 id,外键用 table_id
    nekoneko
        84
    nekoneko  
       2020-09-23 10:38:24 +08:00
    @Rwing #9 有用到的,用来对表进行分组
    lepig
        85
    lepig  
       2020-09-23 10:47:06 +08:00
    我个人倾向就是每个表都有一个 ID 主键,外键用 table_id
    lambdaq
        86
    lambdaq  
       2020-09-23 10:50:44 +08:00
    postgres 里 id 就是一个单独的表。
    liuxu
        87
    liuxu  
       2020-09-23 10:54:04 +08:00
    香,结贴。
    cs419
        88
    cs419  
       2020-09-23 10:54:39 +08:00
    这里的 `table 名+ID` 这个是指 user 表中 用 user_id 当 pk 么
    如果是这种 那应该用的人比较少吧

    大部分人应该都是 用 id 作为唯一标识
    user 表的 pk 是 id
    order 表 pk 是 id fk 是 user_id

    同时用 id 和 code
    id 是 pk 自然是唯一的
    code 作为外部关联标识应当是唯一的
    这样的话 不觉着 id 略显多余么 干脆别用 id 直接 code 作为 pk

    通常表里还会加两个字段 创建时间 修改时间
    查最新数据用 创建时间字段 比 id 字段 更恰当
    Numbcoder
        89
    Numbcoder  
       2020-09-23 10:59:47 +08:00
    这么用的基本都是野鸡程序员,凡是正规学过数据库课程的人都知道不存在语义问题
    everhythm
        90
    everhythm  
       2020-09-23 11:04:34 +08:00
    看情况,直接冗余也是可以的,1 个表 id 和 user_id 都有也正常,user_id 不是字符串的情况也是有的
    bugFactory
        91
    bugFactory  
       2020-09-23 11:11:32 +08:00
    个人习惯吧
    table a (id pk, b_id fk)
    bugFactory
        92
    bugFactory  
       2020-09-23 11:12:00 +08:00
    @bugFactory table b (id pk)
    mirrorpen
        93
    mirrorpen  
       2020-09-23 11:24:31 +08:00
    个人倾向字段名统一,id 就 id,name 就 name,title 就 title,外键用 table_字段不就好了,而且不同表对应不同业务为啥会混淆。。
    pastgift
        94
    pastgift  
       2020-09-23 11:27:06 +08:00 via iPhone
    规范而已,不必大惊小怪。
    一般规范都来源于血泪史,而每个人的血泪史都有所不同,所以有不同的规范很正常。
    adoula
        95
    adoula  
       2020-09-23 11:27:14 +08:00
    根本不需要前缀,你们这些笨蛋,大笨蛋
    mirrorpen
        96
    mirrorpen  
       2020-09-23 11:29:30 +08:00
    @mirrorpen 有的时候表名太长,字段名前加表前缀是又丑又长..(暗指我司老项目的数据库设计)
    malaohu
        97
    malaohu  
       2020-09-23 11:34:57 +08:00
    统一规范。
    列表直接叫 d 也可以。
    forty
        98
    forty  
       2020-09-23 11:43:34 +08:00
    “非要” 是指什么? 谁非要?你女朋友的要求,你领导的要求,还是团队的规范?
    每个团队有自己的习惯和配套的工具等,进行统一要求能够带来一些便利。

    叫 xxx_id 而不是 id 的好处就是可以单独用的时候也具备辨识度(包括语义、可读性),多表协同的时候能提供一部分便利。

    你在一个系统里,统一规范就好,别一会东一会西。

    如果你一般都是 select * from xxx order by id desc limit 1 这么简单的事情,那显然没必要纠结。

    就像写个 hello world 没必要引入一大堆框架,搞上一大堆设计模式。
    newmlp
        99
    newmlp  
       2020-09-23 12:04:05 +08:00
    我的字段怎么定义关你屁事,这也要发帖?
    cheng6563
        100
    cheng6563  
       2020-09-23 12:40:42 +08:00 via Android
    只叫 ID 就行了。加短前不就是匈牙利命名法么,缀稍微多几个表就要重名,然后要么要特殊设计记不住的前缀,要么还是要带上表名
    1  2  
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2676 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 02:30 PVG 10:30 LAX 19:30 JFK 22:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86