在Redshift中规范化数据

时间:2014-06-20 01:26:58

标签: normalization amazon-redshift

我最近开始使用Redshift来容纳数百万个数据点,其模式如下所示:

create table metrics (
  name varchar(100),
  value decimal(18,4),
  time timestamp
) sortkey (name, timestamp);

(真正的架构有点复杂,但这将满足我的问题)

我想知道将度量标准名称(当前为varchar(100))标准化是否有意义,方法是将其映射为整数并仅存储整数。 (例如{id:1,name:metric1})。 name的基数为~100。通过添加映射,它会使应用程序逻辑变得更加复杂,因为它有许多输入流。此外,提前查询它需要反向映射。

在传统的sql数据库中,这显然是肯定的,但我不确定Redshift如何处理它,因为它是一个柱状数据存储。我认为一般情况下会很好,但我认为Redshift可以/可以在引擎盖下做一些类似的映射,因为任何表中的某些列的基数都低于其他列。

2 个答案:

答案 0 :(得分:3)

答案是否定的。 Redshift充分利用了压缩功能,并且可以存储很少的名称字段副本。

但是,您确实需要确保充分利用Redshift的压缩选项。文档中的这一部分应该告诉您需要知道的所有内容:http://docs.aws.amazon.com/redshift/latest/dg/t_Compressing_data_on_disk.html

TL; DR:在表上运行ANALYZE COMPRESSION以查看Redshift建议的压缩,使用这些编码创建新表,并将数据插入该表。

答案 1 :(得分:0)

您最好的选择是继续使用varchar数据类型,就像您在这里一样,但应用" bytedict"压缩类型。在内部,这与创建查找表相同,但它实际上可能更快,因为Redshift本身可以理解管理它自己的表并在列解码期间内部地从int->字符串映射。

以下是bytedict doc参考: http://docs.aws.amazon.com/redshift/latest/dg/c_Byte_dictionary_encoding.html

另一个可以为您的用例提供良好性能/存储节省的选项是runlength: http://docs.aws.amazon.com/redshift/latest/dg/c_Runlength_encoding.html