Sql 使用像MonetDB这样的柱状数据库来避免维度建模?
我想知道您是否认为使用monetdb(或另一个专栏数据库)将所有数据放在一个大的平面表中,而不是将其拆分为几个相关的表是合理的 例如,二手车数据库flat可能如下所示: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
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来说,这些模式是非常糟糕的选择。我也在研究用柱状数据库替换/使用星型模式设计的方法,请告诉我您当前的看法。您可以参考的任何帮助资料。为适当的用例创建了柱状数据库。这些用例与我们目前在关系规范化数据库中的用例不同。我们无法将所有内容都放入柱状数据库中。柱状数据库并不适用于需要频繁更新的数据。