› 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
classyk
V2EX  ›  MySQL

无唯一键情况下的增量数据插入问题

  •  
  •   classyk · Dec 31, 2019 · 5370 views
    This topic created in 2460 days ago, the information mentioned may be changed or developed.
    请教各位一个问题,现在数据源在一天以内存在完全一样的数据,也无法根据有限信息生成唯一的键值,但是每次 client 端传上来的都是当日的全量数据。
    例如当前某时刻有 ABCDE 三条记录,接下来 client 又传上来了 AABCD 五条数据。因此实际新增的是 AD 两条数据需要插入到数据库,并移除 E 记录. 移除记录的情况非常少,但是无法杜绝。

    这种有什么好的处理方式么?当前做的是服务端做的逐一对比去重处理,但是非常耗时,client 本身也无法去重,因为可能存在多个 client 传同一份数据的情况。
    Supplement 1  ·  Dec 31, 2019
    更改一下上方的描述

    例如当前某时刻有 ABCE 四条记录,接下来 client 又传上来了 AABCD 五条数据。因此实际新增的是 AD 两条数据需要插入到数据库,并移除 E 记录.

    当前做的是两个列表一一对比,然后增加和移除。有点效率问题。
    所以想问问有没有更好的方案来处理

    数据源就是这么坑爹~~~~~~
    20 replies  •  2019-12-31 18:11:30 +08:00
    yidinghe
        1
    yidinghe  
    PRO
       Dec 31, 2019 via Android
    分两方面,一是入口把关,而是存量记录清除。入口把关就是找个 Redis 缓存唯一键,存在重复则不插入数据库。这部分先做。然后对存量记录进行清理,清理完将唯一索引建起来。
    wangyzj
        2
    wangyzj  
       Dec 31, 2019
    哈希排重?
    classyk
        3
    classyk  
    OP
       Dec 31, 2019
    @yidinghe 存在完全一样的数据,所以没法得到唯一键
    tabris17
        4
    tabris17  
       Dec 31, 2019
    先写入再去重
    shengchen11
        5
    shengchen11  
       Dec 31, 2019
    直接 truncate 在 insert 不可以吗
    lazyfighter
        6
    lazyfighter  
       Dec 31, 2019
    我都没看懂这句话。。。例如当前某时刻有 ABCDE 三条记录,接下来 client 又传上来了 AABCD 五条数据。因此实际新增的是 AD 两条数据需要插入到数据库
    reus
        7
    reus  
       Dec 31, 2019
    不问业务方,问 V2EX ?
    明显是业务问题,你自己都说了 ABCD,这不就是唯一键?你又说无法生成,自相矛盾。
    reus
        8
    reus  
       Dec 31, 2019
    你怎么判断出 ABCDE,你就怎么生成唯一键,就这么简单。
    lovelive1024
        9
    lovelive1024  
       Dec 31, 2019
    你这需求就有问题,既然存在完全一样的数据,你没有标识怎么可能区分出来,就算是你一个人来也区分不出来,更别说程序了
    dallaslu
        10
    dallaslu  
       Dec 31, 2019
    例如当前某时刻有 ABCDE 三条记录,接下来 client 又传上来了 AABCD 五条数据。因此实际新增的是 AD 两条数据需要插入到数据库,并移除 E 记录.

    你是想这么说吗:

    例如当前某时刻有 BCE 三条记录,接下来 client 又传上来了 AABCD 五条数据。因此实际新增的是 AD 两条数据需要插入到数据库,并移除 E 记录.
    sun1991
        11
    sun1991  
       Dec 31, 2019
    限制数据时间范围, 比如 5 年. 全盘接受所有的上传数据, 然后等到每天凌晨跑一遍耗时的去重. 第二天再开放前一天上传的数据给用户.
    classyk
        12
    classyk  
    OP
       Dec 31, 2019
    ABCDE 自然是可以判断是不同的
    但是 AAAA 呢??我的意思是 AAAA 要插入 4 条数据,而不是一条 A
    classyk
        13
    classyk  
    OP
       Dec 31, 2019
    @dallaslu 也不是。应当是

    例如当前某时刻有 ABCE 四条记录,接下来 client 又传上来了 AABCD 五条数据。因此实际新增的是 AD 两条数据需要插入到数据库,并移除 E 记录.
    classyk
        14
    classyk  
    OP
       Dec 31, 2019
    @sun1991 还涉及到另外一个系统要用数据,数据也需要及时性处理。所以目前才很麻烦。
    index90
        15
    index90  
       Dec 31, 2019
    #12 为什么只有 AD 两条数据要插入数据库,而 BC 不用?
    哦?貌似是有序的?我只能想到能够转化为这样的问题,两条字符串( ABCE 与 AABCD ),求最长子串匹配,最后再求差异?

    或者 LZ 先组织好语言再上来问?
    classyk
        16
    classyk  
    OP
       Dec 31, 2019
    @index90 因为 BC 数据库中已经存在了
    oubenruing
        17
    oubenruing  
       Dec 31, 2019
    例如当前某时刻有 ABCE 四条记录,接下来 client 又传上来了 AABCD 五条数据。因此实际新增的是 AD 两条数据需要插入到数据库,并移除 E 记录.
    先清空然 ABCE,再 AABCD 全部插入的意思?
    matepi
        18
    matepi  
       Dec 31, 2019
    1 楼 2 楼不是说的挺好的么?
    就是在一段时间内对记录全字段做 hash,然后放内存 redis 之类 hash 命中后去重呗

    楼主第 12 楼没看懂,是完全重复的 4 条 AAAA,还是必须都留在数据库里面的?
    那去重的原则是什么?
    是一次性上来的 AAAA,要入库;但之前数据库如果已经有了 A,那么这次上来的 AAAA 不入库?还是少入一个,只入 3 个 AAA ?

    需求再组织下。很多疑问。
    coconut5200
        19
    coconut5200  
       Dec 31, 2019
    1. 根据有明显特征的几个字段,哈希一下作为你的唯一键
    2. 每天定时跑脚本驱虫
    index90
        20
    index90  
       Dec 31, 2019
    @classyk 所以 A 不在数据库中?所以 A 就要插入?
    那说有 ABCE 四条记录又是什么意思? ABCE 不在数据库里面?
    不对啊,你刚刚才说 BC 在数据库里面的。所以 ABCE 四条数据,只有 BC 在数据库里面?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1040 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 18:26 · PVG 02:26 · LAX 11:26 · JFK 14:26
    ♥ Do have faith in what you're doing.