V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
luxinfl
V2EX  ›  程序员

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

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

    大佬们的主键字段名是怎么定义的?难道不叫 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   ❤️ 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 库 跑多个应用 在表名上加前缀来区分
    cedoo22
        37
    cedoo22  
       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   ·   实用小工具   ·   2767 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 10:10 · PVG 18:10 · LAX 02:10 · JFK 05:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.