Sql 使用像MonetDB这样的柱状数据库来避免维度建模?

Sql 使用像MonetDB这样的柱状数据库来避免维度建模?,sql,database,cassandra,database-schema,monetdb,Sql,Database,Cassandra,Database Schema,Monetdb,我想知道您是否认为使用monetdb(或另一个专栏数据库)将所有数据放在一个大的平面表中,而不是将其拆分为几个相关的表是合理的 例如,二手车数据库flat可能如下所示: Make Model Year Color Mileage Chevy Malibu 2009 orange 102100 Chevy Malibu 2009 orange 98112 Chevy Malibu 2008 orange 210232 Chevy

我想知道您是否认为使用monetdb(或另一个专栏数据库)将所有数据放在一个大的平面表中,而不是将其拆分为几个相关的表是合理的

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

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页,共页)。本质:从查询处理的角度来看,您通常会更好地使用规范化的模式,而不是让系统为您找出模式


回答您的特定问题:MonetDB不压缩字符串以外的数据(甚至只有在只有少数唯一字符串的情况下才压缩数据)。我建议您花点精力定义一个关系模式,或者如果您确实不能的话,切换到一个无模式的DBMS。这自然会带来性能损失。

SQL Server、Oracle等也可以很好地压缩数据。问题不是一般的大小,甚至不是性能,而是由于模型没有正确规范化而不可避免地引入的逻辑错误。面向列的数据库非常适合用于分析,而不是事务处理。列压缩是一个优势,因为星型和雪花型模式预期有许多列,每个列在许多行中的列范围相当窄。但是,对于OLTP来说,这些模式是非常糟糕的选择。我也在研究用柱状数据库替换/使用星型模式设计的方法,请告诉我您当前的看法。您可以参考的任何帮助资料。为适当的用例创建了柱状数据库。这些用例与我们目前在关系规范化数据库中的用例不同。我们无法将所有内容都放入柱状数据库中。柱状数据库并不适用于需要频繁更新的数据。