- st=>start: 开端
- e=>end: 停止
- io1=>inputoutput: 输入网址
- io2=>inputoutput: 返回短网址
- io3=>inputoutput: 提示用户
- 该短码已存在
- io4=>inputoutput: 提示用户
- 不克不及输入短链接
- op1=>operation: 返回短码
- op2=>operation: 保存输入的网址到数据库
- op3=>operation: 根据id计算对应的短码
- op4=>operation: 萌芽数据库
- 获得一条
- 自定义短码的url
- 对应的id记录
- op5=>operation: 更新短码到数据库
- cond1=>condition: 萌芽数据库
- 是否存在该URL
- cond2=>condition: 用户选择
- 自定义短码
- cond3=>condition: 生成的短码
- 是否存在
- cond4=>condition: 短码是否存在
- cond5=>condition: 短码是否存在
- cond6=>condition: 自定义的短码
- 是否存在
- cond7=>condition: 用户输入的是短链接
- st->io1->cond7
- cond7(no,bottom)->cond1
- cond7(yes)->io4->e
- cond1(no,bottom)->cond2
- cond1(yes)->op1->io2->e
- cond2(no,bottom)->op3->cond4
- cond2(yes)->cond5
- cond4(no, bottom)->op5->op1->io2->e
- cond4(yes)->op4->op3->cond4
- cond5(no,bottom)->op5
- cond5(yes)->io3->e
然则自增序列算法是和 id 绑定的,如不雅许可自定义短码就会占用之后的短码,之后的 id 要生成短码的时刻就发明短码已经被用了,那么 id 自增一对一不冲突的优势就表现不出来了。
那么怎么实现自定义短码呐?
我是如许处理的:
- 数据库增长一个类型 type 字段,用来标记短码是用户自定义生成的,照样体系主动生成的。
- 如不雅有效户自定义过短码,把它的类型标记自定义。每次根据 id 计算短码的时刻,如不雅发明对应的短码被占用了,就大年夜类型为自定义的记录里拔取一笔记录,用它的 id 去计算短码。
- 如许既可以区分哪些长连接是用户本身定义照样体系主动生成的,还可以不浪费被自定义短码占用的 id
我保存了 1 到 2 位的 短码,安闲位的短码开端生成的。厩ㄑ域名的保存域名一样,好的要本身预留 :smirk:
数据表设计
links 表
后期功能扩大