V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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 · 2019-12-31 14:02:18 +08:00 · 4366 次点击
    这是一个创建于 1800 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教各位一个问题,现在数据源在一天以内存在完全一样的数据,也无法根据有限信息生成唯一的键值,但是每次 client 端传上来的都是当日的全量数据。
    例如当前某时刻有 ABCDE 三条记录,接下来 client 又传上来了 AABCD 五条数据。因此实际新增的是 AD 两条数据需要插入到数据库,并移除 E 记录. 移除记录的情况非常少,但是无法杜绝。

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

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

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

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

    你是想这么说吗:

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

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

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

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

    需求再组织下。很多疑问。
    coconut5200
        19
    coconut5200  
       2019-12-31 17:21:54 +08:00
    1. 根据有明显特征的几个字段,哈希一下作为你的唯一键
    2. 每天定时跑脚本驱虫
    index90
        20
    index90  
       2019-12-31 18:11:30 +08:00
    @classyk 所以 A 不在数据库中?所以 A 就要插入?
    那说有 ABCE 四条记录又是什么意思? ABCE 不在数据库里面?
    不对啊,你刚刚才说 BC 在数据库里面的。所以 ABCE 四条数据,只有 BC 在数据库里面?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5884 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:37 · PVG 10:37 · LAX 18:37 · JFK 21:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.