数据库主键选型(默认/用户名/内容名)及Django URL配置咨询
Django主键选择与URL配置问题解答
1. 用户表用username做主键靠谱吗?
真心不建议直接拿username当主键,原因很实在:
- 业务变动坑大:哪天产品要求允许用户改username了,主键一改,所有关联这个用户的外键数据(比如发帖、评论)都得跟着改,折腾死人还容易出bug。
- 性能不如整数主键:字符串类型的主键索引效率比自增整数差远了,数据量上来之后,查询和关联操作的速度差距会很明显。
- 兼容性麻烦:Django自带的认证系统、很多第三方库都是默认适配整数主键的,硬改字符串主键容易踩各种莫名其妙的坑。
不如就保留默认的自增整数主键,给username加个unique=True约束保证唯一就行。
2. 音乐帖、图片帖能用内容名称做主键吗?
绝对不行,踩过坑的人都懂:
- 重名是常态:不同用户发同名的内容太常见了,就算加用户ID凑成复合主键,不仅主键变长,后续查询关联也麻烦。
- 内容名称会改:用户心血来潮改个帖名,主键就得跟着变,关联的评论、点赞记录全得同步更新,维护成本拉满。
- 性能拖后腿:还是字符串主键的老问题,数据量一大,查询速度明显慢于整数主键。
这类内容表老老实实沿用默认自增整数主键就行,要是需要友好的URL标识,可以额外加个随机生成的slug字段(设unique=True),专门用来在URL里展示。
3. 文本类型主键怎么改Django的URL配置?
你现在的URL配置是:
path('genre_list/<int:pk>/',views.GenreDetailView.as_view(),name='genre_detail'),
改成文本主键的话,不能直接只写<pk>,得指定对应的转换器:
- 普通文本主键用
<str:pk>就行,str转换器能匹配除了斜杠之外的所有字符,覆盖大部分场景:path('genre_list/<str:pk>/',views.GenreDetailView.as_view(),name='genre_detail'), - 如果你的文本主键只有字母、数字、下划线或短横线,用
<slug:pk>更安全,它只匹配符合[a-zA-Z0-9-_]+格式的字符串:path('genre_list/<slug:pk>/',views.GenreDetailView.as_view(),name='genre_detail'), - 要是你的主键必须包含特殊字符(比如斜杠),那得自定义URL转换器,但这种情况极少,真遇到了也不建议这么设计主键,纯属给自己找事。
内容的提问来源于stack exchange,提问作者Nicolas_Darksoul
相关产品推荐
相关产品推荐

