使用像 MonetDB 这样的列式数据库来避免维度建模



我想知道你是否认为使用monetdb(或其他列式数据库)将所有数据放在一个大的平面表中,而不是将其分解为几个相关的表是合理的。

例如,二手车数据库,平面,可能如下所示:

Make    Model   Year   Color    Mileage
Chevy   Malibu  2009   orange   102100   
Chevy   Malibu  2009   orange   98112
Chevy   Malibu  2008   orange   210232
Chevy   Malibu  2009   pink     150100

注意到Make-Model-Year-Color,SQL数据库或Excel电子表格或其他任何表格中的冗余,您可能有两个表,例如:

mId   Make   Model   Year  Color
1     Chevy  Malibu  2009  orange
2     Chevy  Malibu  2008  orange
3     Chevy  Malibu  2009  pink
mId   Mileage
1     102100   
1     98112
2     210232
3     150100

这有助于冗余,但代价是更复杂的查询,并且必须考虑如何分解(分解)表。

我正在阅读有关列式数据库的信息,尤其是 monetdb。看起来,由于 monetdb 单独压缩列,冗余无关紧要,您只需使用期望相同或更好的性能(查询时间、磁盘使用情况)的平面表,就像一组分解良好的关系表一样。这节省了设计工作,但更好的是让你完全自动化模式设计 - 通过避免它。

你觉得怎么样?是否有一些我没有看到的隐藏成本?

看来你做对了。根据我的经验,列式数据库和 MonetDB 尤其像您描述的那样,以数据结构提供极快的查询时间。对于您描述的示例,列式数据库将对每一列进行编码和压缩(自然包含相同类型的数据,但重复次数很多)。

无论如何,如果您的工作负载包含大量更新,请在决定之前对解决方案进行基准测试。

就我个人而言,我认为MonetDB的性能比大多数商业面向列的数据库要好得多,并且比面向行或NoSQL要好得多,但是要记住的底线是每种情况都有自己的行为。

你所描述的(a.f.a.i.k.)被称为"统一表方法"。非常聪明的人试图围绕这个想法实施系统并放弃了它。最新的(不成功)尝试是 IBM DB2 Blink 项目(阅读第 3 页,共 http://homepages.cwi.nl/~idreos/BlinkDebull2012.pdf 页)。本质:从查询处理的角度来看,通常最好使用规范化架构,而不是让系统为您找出架构。

回答您的具体问题:MonetDB 不会压缩字符串以外的数据(甚至仅在唯一字符串很少时才压缩数据)。我建议您花费精力定义关系模式或切换到无模式DBMS,如果您真的不能。这自然会受到性能损失。

相关内容

  • 没有找到相关文章

最新更新