我们假设我有一张桌子,可以找到所有新购买的商品'它会重新创建一个除了新项目之外的所有相同值的行,并且有1000个不同的项目。
ID Time Date Cashier Item Bought
0001 12:00 16/1/26 Bob Apple
0001 12:00 16/1/26 Bob chicken
0001 12:00 16/1/26 Bob eggs
0001 12:00 16/1/26 Bob Banana
0002 12:30 16/1/27 Steve Apple
0002 12:30 16/1/27 Steve pork
0002 12:30 16/1/27 Steve milk
我尝试做的是以节省空间的方式压缩行,但仍允许我按项搜索事务。
我尝试过的事情
位操作
将每个位分配给一个项目。
Item Bit
Apple 1 (0000 0001)
eggs 2 (0000 0010)
Chicken 3 (0000 0100)
fish 4
Banana 5
pork 6
milk 7
.
.
.
(to 1000)
更改
ID Time Date Cashier Item Bought
0001 12:00 16/1/26 Bob Apple
0001 12:00 16/1/26 Bob chicken
0001 12:00 16/1/26 Bob eggs
0001 12:00 16/1/26 Bob Banana
向
ID Time Date Cashier Items Bought
0001 12:00 16/1/26 Bob 0001 0111
我可以按位操作来检查项目。
检查交易是否有苹果和香蕉
0001 0111 Items Bought
0001 0001 Check = bits for apple and banana
逻辑:if(~Check或Items Bought == 0)(包括)
1110 1110 ~Check
0001 0111 Items Bought
0000 0000
问题是你只能使用BIGINT进行最多64位的按位操作。我需要1000位或16个额外的列。
Prime数字
根据购买物品的频率分配素数
Item Bought Assigned Prime
Apple 190893 2
eggs 150022 3
Chicken 71026 5
fish 59827 7
Banana 10274 11
pork 5271 13
milk 1021 17
.
.
.
(to 1000)
每列将每个素数相乘
变化
ID Time Date Cashier Item Bought
0001 12:00 16/1/26 Bob Apple
0001 12:00 16/1/26 Bob chicken
0001 12:00 16/1/26 Bob eggs
0001 12:00 16/1/26 Bob Banana
0002 12:30 16/1/27 Steve Apple
0002 12:30 16/1/27 Steve pork
0002 12:30 16/1/27 Steve milk
到
ID Time Date Cashier Items Bought
0001 12:00 16/1/26 Bob 330 (2 * 5 * 3 * 11)
0002 12:30 16/1/27 Steve 442 (2 * 13 * 17)
如果我想查看哪些交易有项目,请将列除以该素数。通过素数的属性,如果结果是整数,则事务确实具有该项。
检查交易是否有苹果和香蕉
primeCheck = 22(2 * 11)
逻辑:If(Items Bought%primeCheck == 0)(包含)
ID Time Date Cashier Include
0001 12:00 16/1/26 Bob YES 330 % 22 = 0
0002 12:30 16/1/27 Steve NO 442 % 22 = 2
问题是,素数乘以非常快。我之所以使用这种过度位操作,是因为对于BM,无论项目如何,我都需要1024位。
字符串连接
更改
ID Time Date Cashier Item Bought
0001 12:00 16/1/26 Bob Apple
0001 12:00 16/1/26 Bob chicken
0001 12:00 16/1/26 Bob eggs
0001 12:00 16/1/26 Bob Banana
向
ID Time Date Cashier Items Bought
0001 12:00 16/1/26 Bob Apple, chicken, eggs, Banana
问题是迭代每个项目购买字符串的搜索复杂性。
有什么建议吗?
答案 0 :(得分:0)
为什么不简单地规范表结构? 像下面这样的东西也许......
Column A - single quote
Column B - some number
Column C - single quote plus a comma