V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sys64
V2EX  ›  Python

怎么设计一个网站的永久链接

  •  
  •   sys64 · 2016-11-21 18:28:05 +08:00 · 4284 次点击
    这是一个创建于 2928 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如: 百度贴吧:
    http://tieba.baidu.com/p/4855169060/
    什么值得买:
    http://www.smzdm.com/p/6664641/
    v2ex:
    https://www.v2ex.com/t/322033

    这个后面的数字是通过什么规则生成的,还是直接用数据库的自增 id

    25 条回复    2016-12-01 09:37:38 +08:00
    goofansu
        1
    goofansu  
       2016-11-21 19:19:15 +08:00
    v2 肯定是自增 id
    sys64
        2
    sys64  
    OP
       2016-11-21 20:15:40 +08:00
    @goofansu 嗯,应该是。我刚访问了一下
    /t/2
    /t/3
    /t/4
    应该是自增 ID ,如果是用数据库自增 id ,那这个 id 是保存到数据库的时候生成的,感觉这样设计不太好吧。不知道还有没有其他的方式生成,可以在保存到数据库之前就能生产一个唯一的链接 id ,但生成的数字 id 也不能太长。
    kslr
        3
    kslr  
       2016-11-21 20:30:52 +08:00 via Android
    自增是个非常简单实用的解决方案。当然考虑到隐私保护或者大规模部署也有其解决方案,你可以搜搜 ID 策略。
    lissome
        4
    lissome  
       2016-11-21 20:54:57 +08:00
    自增序列挺好的
    lhbc
        5
    lhbc  
       2016-11-21 21:11:37 +08:00 via iPhone
    short uuid
    sys64
        6
    sys64  
    OP
       2016-11-21 21:58:55 +08:00
    @kslr @lissome 哦,那这个自增序列,是由保存到数据库的时候,由数据库的自增字段提供的吗?感觉这样的设计有问题,这个永久链接应该是网站 url 逻辑的一部分,不应该由数据库来生成。

    @lhbc 看了一下能提供数字的短 id ,但不能保证唯一。应该需要自己写保证唯一的逻辑。
    phithon
        7
    phithon  
       2016-11-21 22:20:27 +08:00
    http://wiki.ioin.in/ 用的 hashids
    zhanglintc
        8
    zhanglintc  
       2016-11-21 22:35:29 +08:00
    @sys64 居然没有 /t/2 这不科学
    zhanglintc
        9
    zhanglintc  
       2016-11-21 22:36:01 +08:00
    @sys64 写错了 居然没有 /t/0 这不科学
    rogwan
        10
    rogwan  
       2016-11-21 22:48:40 +08:00 via Android
    稍微大一些的数据量,一般不建议用自增吧。不过一般的应用根本到不了自增 ID 是瓶颈的状态 LOL

    据说有理想的是 随机数+uuid+时间戳 组合生成 ID ,看着有点长,其它没什么问题
    windowsma
        11
    windowsma  
       2016-11-21 23:25:10 +08:00
    @sys64 您这个思维还是很独特的。。。只能说思维比较奇葩。
    不过可以自己写个发号器,根据时间、密钥等,生成唯一 uuid 。微博就是这么做的
    sys64
        12
    sys64  
    OP
       2016-11-21 23:29:31 +08:00
    @windowsma 哦,请看我贴出的网址的 url ,如 http://tieba.baidu.com/p/4855169060/ 希望是短数字的不重复的。
    lhbc
        13
    lhbc  
       2016-11-21 23:33:56 +08:00 via iPhone
    @sys64 自增 id+unix time 不就行了,不重复,无冲突,无法遍历。
    sys64
        14
    sys64  
    OP
       2016-11-21 23:44:49 +08:00
    @lhbc 谢谢的回复,不过这么说,那其实 unix timestamp 就是唯一的了,加不加自增 id 就无所谓了。自增 id 如果是数据库提供的话,那必须先查数据库(或由保存到数据库的时候返回的)才能得到。
    nfroot
        15
    nfroot  
       2016-11-22 01:16:35 +08:00
    @sys64 unix timestamp 还不至于唯一。精确到毫秒也不至于唯一,但是可以 time()+rnd(time())
    misaka19000
        16
    misaka19000  
       2016-11-22 01:54:18 +08:00 via Android
    如果用的是 MySQL ,那么自增是个非常好的解决方案,如果因为某些原因用不了自增,那用 UUID 也可以
    onlyhot
        17
    onlyhot  
       2016-11-22 04:11:47 +08:00 via iPhone
    id uid time
    Vicer
        18
    Vicer  
       2016-11-22 08:30:21 +08:00 via Android
    UUID+unix timestamp
    wwek
        19
    wwek  
       2016-11-22 08:50:55 +08:00
    规则上没有什么标准范式
    我觉得豆瓣的设计的就不错

    给你一个思路,把 URL 结构看成倒置树状结构
    什么地方用文件夹,什么地方用文件你就非常清楚了
    另外如果现在还考虑传统 SEO 的话,这个树应该是低而广阔的树,顾名思义就是目录不要深,摊开
    wwek
        20
    wwek  
       2016-11-22 08:51:50 +08:00
    ID
    1. 自增
    2. 放号器
    Tink
        21
    Tink  
       2016-11-22 08:54:59 +08:00
    时间戳并不唯一
    qiayue
        22
    qiayue  
       2016-11-22 09:31:53 +08:00
    @sys64
    你只看到了 http://tieba.baidu.com/p/4855169060/ ,你觉得 4855169060 这么大的数不可能是自增 ID ,但是你没有考虑到贴吧的流量有多大,发帖量有多大。
    最简单的, http://tieba.baidu.com/p/2 可以打开,而 http://tieba.baidu.com/p/1 提示“很抱歉,该贴已被删除。”,所以是帖子被删除了,而不是不曾存在过。
    windowsma
        23
    windowsma  
       2016-11-22 10:42:05 +08:00
    @sys64 贴吧其实也是自增的,自增键确实是最简单、靠谱的方案。不过题主的要求也是可以实现的,不外乎就是时间戳、内部计数器组合成的,如果有多个业务或服务器,也可以把业务、服务器编号揉进来。内部计数器是不可少的,可以用 memecache 或 redis 实现,毕竟时间戳+随机数的形式也不能保证唯一。
    如果嫌长度太长,可以转为 16 进制或自定义进制。
    anyforever
        24
    anyforever  
       2016-11-22 13:48:11 +08:00
    自增就很好理解了, UUID ,放号器上面也有朋友提到,以下供参考
    https://github.com/zheng-ji/goSnowFlake
    https://github.com/osgochina/donkeyid
    anyforever
        25
    anyforever  
       2016-12-01 09:37:38 +08:00
    恰巧又碰到一篇关于这个的 http://calvin1978.blogcn.com/articles/uuid.html
    帖上来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3604 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:46 · PVG 18:46 · LAX 02:46 · JFK 05:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.