【发布时间】:2021-04-15 10:26:06
【问题描述】:
我有一个相当独特的需求,我已经尝试解决好几个星期了。我有一个解决方案,但我认为它不够强大。
问题
我需要为使用 CSV 文件上传的项目生成唯一的个性化 唯一 标签。随着时间的推移,这些项目可能会增长到数十亿,并且通常会在 60/90 天后过期。因此,随着时间的推移,我添加的记录越多,我也会删除它们。删除很重要,因为我想确保给出一个长度最短的标签。
例如。假设我需要为以下项目分配标签。
department = 'A'
items = [ 1 => foo, 2 => bar, 3 => nik, 4 => mik, 5 => baz, 6 => nik, 7 => baz, 8 => baz, 9 => baz, 10 => naz]
department = 'B'
items = [ 1 => foo, 2 => bar, 3 => nik, 4 => mik, 5 => baz, 6 => nik, 7 => baz, 8 => baz, 9 => baz, 10 => naz]
插入这些记录后,我需要输出如下。
部门
| id | name |
|---|---|
| 1 | A |
| 2 | B |
项目
| id | name | label | segment_value | department_id |
|---|---|---|---|---|
| 1 | foo | foo | 0 | 1 |
| 2 | bar | bar | 0 | 1 |
| 3 | nik | nik | 0 | 1 |
| 4 | mik | mik | 0 | 1 |
| 5 | baz | baz | 0 | 1 |
| 6 | nik | nik1 | 1 | 1 |
| 7 | baz | baz1 | 1 | 1 |
| 8 | baz | baz2 | 2 | 1 |
| 9 | baz | baz3 | 3 | 1 |
| 11 | foo | foo | 0 | 2 |
| 12 | bar | bar | 0 | 2 |
| 13 | nik | nik | 0 | 2 |
| 14 | mik | mik | 0 | 2 |
| 15 | baz | baz | 0 | 2 |
| 16 | nik | nik1 | 1 | 2 |
| 17 | baz | baz1 | 1 | 2 |
| 18 | baz | baz2 | 2 | 2 |
| 19 | baz | baz3 | 3 | 2 |
| 20 | naz | naz | 0 | 2 |
我想要这种行为的原因是因为我需要一种方法来反向查找带有这样的参数的项目。 A/baz3 应该能够映射 items 表上的第 9 项。
当前解决方案
现在我有一个触发器,它在插入记录后更新标签。我维护一个外部计数器,每次插入触发器都会使用该信息来更新标签。
限制/当前问题
我每批插入这些项目 100,000 条记录或 200,000 条记录。所以我想要一个有效的插入。此外,我希望标签具有最小数值(如果我可以在 60 天内删除 baz1 后重新使用它会更好)。此外,我当前的触发器没有为每个 department_id 使用新的 segment_value
CREATE TRIGGER insert_items
BEFORE INSERT ON items
FOR EACH ROW BEGIN
SET NEW.segment_value = ((SELECT IFNULL(MAX(segment_value), 0) from purl_links where segment_key = NEW.segment_key) + 1);
SET NEW.label = CONCAT(NEW.label,NEW.segment_value);
END
我正在寻找一个体面的解决方案,它应该可以帮助我避免冲突,并且能够批量插入并生成尽可能少的数字标签(如果可能,使用可用的旧插槽)。
PS :我试图以最好的方式抽象出我的问题,我正在寻求任何可以得到的帮助。
【问题讨论】:
-
我不确定我是否完全理解这个要求,但你可能想看看
UUID_SHORT。 -
它必须是一串数字吗?
name(前缀)有多长? “最小长度”是指如果前 10 个数字可用,则必须使用 1 个数字? -
您是否需要在导入的同一事务中进行标记?即,您可以在导入批次后重新标记您的项目吗?
-
@RickJames 我的意思是最低限度,我对字符串部分没有限制,我的意思是它将在上传中修复。我将添加数字(并且需要确保它的长度非常短),同时使其独一无二。
-
@timur 不,我可以重新标记。但我还需要在导入后生成一个 csv。因此,在处理完 csv 后无法更改记录。我想我可以在标记后生成 csv。