我想用来存储每一笔交易的用户购买定制标签,例如,如果用户所购买的鞋子,然后标签"SPORTS", "NIKE", SHOES, COLOUR_BLACK, SIZE_12,..
如何设计在分析数据库查询多个标签
这些标签都是卖家有意查询返回理解销售。
我的想法是,当新的标签进入为该标签创建新的代码(类似哈希代码但顺序),代码从"a-z"
26个字母然后"aa, ab, ac...zz"
继续。现在通过与"|"
分开,将所有在一个交易中给出的标签保留在名为tag (varchar)
的一列中。
让我们假设映射(在应用程序级)
"SPORTS" = a
"TENNIS" = b
"CRICKET" = c
...
...
"NIKE" = z //Brands company
"ADIDAS" = aa
"WOODLAND" = ab
...
...
SHOES = ay
...
...
COLOUR_BLACK = bc
COLOUR_RED = bd
COLOUR_BLUE = be
...
SIZE_12 = cq
...
所以储存于上述收购交易,标签就会像tag="|a|z|ay|bc|cq|"
现在允许卖家搜索加入WHERE
条件tag LIKE %|ay|%
卖过鞋的数量。现在的问题是我不能使用索引(在Redshift数据库中的排序键)“LIKE以%开头”。那么如何解决这个问题,因为我可能有1亿条记录?不想全表扫描..
任何解决方案来解决这个问题?
Update_1: 我还没有遵循bridge table
概念(交叉引用表),因为我想在搜索指定标签后对结果执行group by。当一个事务中两个标签匹配时,我的解决方案只会给出一行,但桥接表会给我两行?那么我的sum()将会翻倍。
我建议象下面
EXISTS(SELECT 1 FROM transaction_tag WHERE TAG_ID = 'ZZ' 和TRANS_ID = tr.trans_id)WHERE子句中一次为每个标签(注意:假设TR是一个别名到周边查询中的交易表)
我没有跟着这个;因为我必须对标签执行AND和OR条件,例如(“SPORTS”和“ADIDAS”)----“SHOE”和(“NIKE”或“ADIDAS”)
Update_2: 我还没有其次是位域,因为不知道红移是否有这种支持,我还假设我的系统将会有最少3500个标签,并为每个标签分配一位;这会导致每个事务的437字节,尽管只能为事务提供最多5个标记。这里有什么优化?
Solution_1:
我曾经想过加入分钟(SMALL_INT)和最大值(SMALL_INT)与标签栏沿,以及适用的索引。
所以像这样
"SPORTS" = a = 1
"TENNIS" = b = 2
"CRICKET" = c = 3
...
...
"NIKE" = z = 26
"ADIDAS" = aa = 27
所以我的列值
`tag="|a|z|ay|bc|cq|"` //sorted?
`minTag=1`
`maxTag=95` //for cq
和查询搜索鞋(AY = 51)
maxTag <= 51 AND tag LIKE %|ay|%
,查询搜索鞋(ay = 51)和SIZE_12(cq = 95)是
minTag >= 51 AND maxTag <= 95 AND tag LIKE %|ay|%|cq|%
这会给您带来什么好处吗?请提出任何替代方案。
谢谢!但我需要研究这一点,并回到你身边。我对S3复制命令的理解是:它用于从文件批量插入行。对于我来说,每一行都会有不同的标签,但复制命令对于所有的批量插入都是一次的。 –