SQL Server中的压缩行

时间:2017-07-12 18:26:02

标签: sql-server primes

我们假设我有一张桌子,可以找到所有新购买的商品'它会重新创建一个除了新项目之外的所有相同值的行,并且有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    

问题是迭代每个项目购买字符串的搜索复杂性。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

为什么不简单地规范表结构? 像下面这样的东西也许......

Column A - single quote
Column B - some number
Column C - single quote plus a comma