› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
miniyao
V2EX  ›  MySQL

数据库怎么最简单实现 “栈” 结构存储?

  •  
  •   miniyao · Jan 20, 2018 · 8945 views
    This topic created in 3213 days ago, the information mentioned may be changed or developed.
    比如用数据库保存员工的签到记录,只要求保留最后 30 次的签到记录即可。

    现在是写了个定时任务去每天晚上自动执行“删除超过 30 次的旧记录”,有没有更简单的方法,用类似入栈 /出栈的方式,在员工签到的时候就把这个“删除超过 30 次的旧记录”的操作给办了?

    即:如果新员工签到记录不满 30 条,签到记录就都留着;老员工已经有最近 30 次签到记录的,每次打卡,自动把最早的那条旧记录剔除。
    55 replies  •  2018-01-22 21:33:34 +08:00
    EchoUtopia
    EchoUtopia
    Jan 20, 2018 via iPhone
    1
    这不是队列么……
    miniyao
    miniyao
    OP
    Jan 20, 2018
    2
    @EchoUtopia 活太轻,放队列里去感觉没那么大必要 :-)
    callmedachang
    callmedachang
    Jan 20, 2018
    3
    这个比如怕是 实际需求吧
    miniyao
    miniyao
    OP
    Jan 20, 2018
    4
    @callmedachang 是啊,每次去定时跑一遍删那么几条数据好像杀鸡用了牛刀
    monsterxx03
    monsterxx03
    Jan 20, 2018 via iPhone❤️1
    5
    trigger
    qiayue
    qiayue
    Jan 20, 2018
    6
    每次打卡的时候查一次也可以吧,多了就删
    joshz
    joshz
    Jan 20, 2018 via Android
    7
    打卡的时候写 SP 先删旧的再插新的,或者用 trigher
    est
    est
    Jan 20, 2018 via Android❤️1
    8
    这个不是栈吧。一般是按照时间自动过期

    按条数的很少见

    你真要做,用原子自增然除以 30 的余数作为主键 upsert
    twor
    twor
    Jan 20, 2018
    9
    def save( ):
    ----CheckLog.objects.filter(user=self)[30:].delete()
    twor
    twor
    Jan 20, 2018
    10
    哦 咩有 order_by
    geelaw
    geelaw
    Jan 20, 2018
    11
    @miniyao 我觉得你没理解他的意思——这种先进先出的结构叫做队列,如果是栈,那么最先被删除的是最近的记录。

    回到问题本身,你可以用循环队列的想法。
    feverzsj
    feverzsj
    Jan 20, 2018
    12
    明显 event scheduler 更简单,把数据库能做的都给数据库做,简化代码不是更好?
    rrfeng
    rrfeng
    Jan 20, 2018 via Android
    13
    用 MongoDB,支持 capped collection,自动滚动哦亲(手动斜眼

    一共就 30 条的话每次插完删一次不就好了
    hsuan
    hsuan
    Jan 20, 2018 via Android
    14
    你怕是对栈有什么误解
    gouchaoer
    gouchaoer
    Jan 20, 2018 via Android
    15
    签到记录表 record:
    id
    uid
    created_at
    log
    给 uid 和 created_at 加上联合索引,每次签到插入之后,select 该 uid 所以记录,超过 30 就删


    另外不要用 mongo 不要用 mongo 不要用 mongo
    alcarl
    alcarl
    Jan 20, 2018 via Android
    16
    这是有点想多了。。。。。
    wupher
    wupher
    Jan 20, 2018
    17
    如果 30 天是指按月保存的话。最简单,每月自动建张表就可以了。

    比如每月 1 日,根据当前日期,自动判断表名,将记录添加至该表中。表可预告建好三年。

    月底时不需要就自己删除以前的表。

    其实你这个签到记录就算保留着也没什么大问题啊。


    :-) 另外如果担心签到的人多造成数据太多,可以用 mongo,可以用 mongo , 可以用 mongo
    skywolf
    skywolf
    Jan 20, 2018
    18
    你在数据库里放个触发器不就好了么,数据插入时触发数据分析操作。
    lihongjie0209
    lihongjie0209
    Jan 20, 2018❤️1
    19
    首先, 数据保存的数据和用户看到的数据是两码事.
    数据库可以用标志位假删数据, 但是在用户看来数据就被删除了, 做法也就是在查询时过滤标志位而已.
    同样的, 保留 30 条记录那就 limit 30, 在用户眼中系统只保留了最近 30 次的记录.
    scnace
    scnace
    Jan 21, 2018 via Android
    20
    为啥要删 ORDERBY create_date DESC LIMIT 30 不好吗… 还有 你的需求真的是栈吗 栈是 FIFO 的啊,而你要的是最近的 30 条吧
    brickyang
    brickyang
    Jan 21, 2018 via iPhone
    21
    MongoDB capped collection,极致优雅。
    night98
    night98
    Jan 21, 2018 via Android
    22
    每次签到的时候 count 一下,然后把头部或者尾部的那条记录删了
    geelaw
    geelaw
    Jan 21, 2018
    23
    @scnace FIFO 是队列。
    F281M6Dh8DXpD1g2
    F281M6Dh8DXpD1g2
    Jan 21, 2018 via iPad
    24
    用 mangodb 就是作死,用时一时爽查询火葬场
    scnace
    scnace
    Jan 21, 2018 via Android
    25
    @geelaw 啊 说错了 LZ 的需求应该是 FIFO 算了 我还是滚去睡觉吧😂
    bkmi
    bkmi
    Jan 21, 2018 via Android
    26
    竟然没人问为啥要删吗,这种数据不应该都留着吗?查的时候查最近 30 条就行了
    zxy
    zxy
    Jan 21, 2018
    27
    我想的是你在数据库里存的是每人一个 30 长度的数组,每次 update 下就好了
    liz2nku
    liz2nku
    Jan 21, 2018 via iPhone
    28
    @bkmi 都被直接带入楼主的问题了 23333
    leeg810312
    leeg810312
    Jan 21, 2018 via Android
    29
    这是一个需求分析错误的典型案例,收藏起来当培训素材
    clino
    clino
    Jan 21, 2018 via Android
    30
    这不是栈

    但这是啥? 固定长度的数组?
    bramblex
    bramblex
    Jan 21, 2018
    31
    @clino

    这其实是一个环装结构,一般用单 /双向循环链表实现
    taojing10
    taojing10
    Jan 21, 2018 via Android
    32
    好奇怪的需求……… limit 30 不就好了?不要多此一举
    dexterzzz
    dexterzzz
    Jan 21, 2018
    33
    temporary table 时态控制表
    xrlin
    xrlin
    Jan 21, 2018
    34
    直接 limit 30 不就行了?后续需求改了别人想查看一个季度的签到记录怎么办?
    cnnblike
    cnnblike
    Jan 21, 2018
    35
    只有 30 个的话,你直接 json dump 到文件都成啊?每次遍历一遍又不会多废多少时间的
    yuriko
    yuriko
    Jan 21, 2018
    36
    FIFO -> 队列
    FILO -> 栈

    所以栈?
    wizardoz
    wizardoz
    Jan 21, 2018
    37
    可覆盖的循环队列
    hccdj131
    hccdj131
    Jan 21, 2018 via Android
    38
    设定固定长度,超过这个长度就删除
    gzxultra
    gzxultra
    Jan 21, 2018
    39
    @feverzsj
    数据库服务器的扩展成本比应用服务器大,在线的业务应该尽可能让数据库少做事,业务逻辑放在应用服务器上跑
    cctv6
    cctv6
    Jan 21, 2018 via iPhone
    40
    我觉得应该全部存下来,然后查询到时候只取最近 30 条记录就好了
    murmur
    murmur
    Jan 21, 2018
    41
    只要求保留最后 30 次的签到记录即可-》查询的时候 order by time limit 30
    这需求理解的不到位啊
    murmur
    murmur
    Jan 21, 2018
    42
    更正:不到位->太到位
    这种东西肯定留着要翻旧账的 就算你公司以前没劳资纠纷也要准备好资料
    别说最后 30 次了 这种东西留到他离职后半年都不过分
    签到记录才多少么 1000 人的公司 一天 2 次 一个月才多少数据
    rb6221
    rb6221
    Jan 21, 2018
    43
    用 redis ?最右的 push 出去
    shakoon
    shakoon
    Jan 21, 2018
    44
    删数据一时爽,欲查询时悔断肠
    akira
    akira
    Jan 21, 2018
    45
    所有签到记录放一个原始记录表,另外弄个表来维护最近 30 次签到记录
    jyf
    jyf
    Jan 21, 2018
    46
    @geelaw ring 吧
    keenkiller
    keenkiller
    Jan 21, 2018
    47
    没必要吧…历史数据还是有用的,删了以后后悔吧=,=
    pynix
    pynix
    Jan 21, 2018
    48
    LIMIT(TOP) 30 不就行了。。。。

    记录当然最好保留历史。。。。
    qoras
    qoras
    Jan 21, 2018
    49
    通常都是标志位假删除, 员工签到没有多少数据的吧
    irgil
    irgil
    Jan 21, 2018
    50
    大哥,先进先出是队列
    flyingHagan
    flyingHagan
    Jan 22, 2018
    51
    查的时候直接选取最近的 30 条不就行了,定时删掉也是一个可取的方案,就是不太理解为什么必须删掉这些数据?
    corningsun
    corningsun
    Jan 22, 2018
    52
    同意 @lihongjie0209

    数据千万别真删除了,留着肯定有用的。
    不然后面提前需求,或者撕逼了,你就完了。。
    RainFinder
    RainFinder
    Jan 22, 2018
    53
    签到不应该是按天的吗,一天签 30 次这个月就结束了?
    cgb1021
    cgb1021
    Jan 22, 2018
    54
    按时间排序不就搞定了吗
    mingl0280
    mingl0280
    Jan 22, 2018 via Android
    55
    没必要删吧……
    另外这个是“队列”,FIFO 的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1437 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 132ms · UTC 10:31 · PVG 18:31 · LAX 02:31 · JFK 05:31
    ♥ Do have faith in what you're doing.