2010-01-17 84 views
2
的垂直分区

注意,这种情况是不是很确切地怎么回事,但我做了这个为例)优势表

我有一个表数据的实体即每5更新如果有的话(颜色,品牌,原始时间),几乎不更新的其他数据(秒)(运动数据:速度,标题,纬度,长度和位置时间)。

alt text http://www.freeimagehosting.net/uploads/a67205e99e.jpg

现在我的老板要我在我们的数据库分区这个数据到单独的表(有一个一对一的关系),像这样:

alt text http://www.freeimagehosting.net/uploads/1c699bc3c5.jpg

他使它听起来“显而易见的“,它应该是这样的,但是真的有这些数据分开插入和更新(例如,如果我把一个索引颜色或制造)的任何优势?

+0

@Grasper:你确定FK在正确的桌子上吗? – 2010-04-20 03:10:31

回答

5

这样做垂直分区可能是有意义的。或者它可能不会。

当您使用基于MVCC的引擎时,每次更新一行时,它通常会*复制整行并创建一个新的修改。这是为了使尚未看到更新的其他事务可以在需要时继续读取原始行。

这意味着在非常宽的行中频繁更新一些小列会导致数据库执行的写操作比需要的要多得多。

但并不是那么多,因为通常引擎只会同步它的事务日志,无论非更新列的大小如何,这将是相同的大小,也因为数据行通常存储在块块无论如何都需要写入,无论它有多少变化。

所以这听起来像一个潜在的毫无意义的优化,这就像任何其他的,应当对 一个理由被认为是)真的有性能问题(即是 所需的任何优化)和b)是这个特定的优化解决它的最佳方法?

我认为a)的可能性不大,并且b)也不太可能,所以这个需求的几率几乎不太可能平方。

*某些引擎会对非常大的列进行例外处理,例如大BLOB或文本列,这些列在其他位置保存,如果行中的其他列被更新,则不会复制。

+1

我同意MarkR。问你的老板为什么需要改变。如果他由于性能问题告诉你,你需要检查是否有任何性能问题,如果没有问题,永远不要优化性能。如果您遇到性能问题,则需要对分区进行归一化处理。如果他告诉你这是因为“它必须是这样的”,你可以与他辩论关于数据库正常化的意义和废话,或者只是改变他的(旧学校)设计。 (我会做最后一个。) – Beffa 2010-01-17 22:09:27

0

你的老板是对的。这与“分区”无关,即所谓的标准化。

Read this article.

EDIT:好,“垂直分区”是公知的术语,并且归一化是垂直分区中的一个方法。但在这种情况下,正常化似乎是正确的答案,其中解释的问题(Quote:“...真的有这样的数据分开插入和更新有什么好处”)。标准化的优点和缺点是众所周知的。维基百科文章是一个很好的起点。

为了保持“Erwin Smout”的火焰:“垂直分解”在这里似乎不是一个常用术语。对?

+1

问题中没有任何内容表明原始设计中每辆车有多行。相反,它说的是每隔几秒“更新一次”。 – 2010-01-17 21:49:35

+0

@calmh:我不明白?正如问题所示,其“显而易见”。有解释的余地​​,但对我来说,它看起来很像是疑问者缺乏关于正常化概念的知识(没有任何意图)。 – Frunsi 2010-01-17 21:53:26

+0

我看到现在有一​​个引用“插入”的结尾,这两者之前都没有,或者我错过了。删除downvote。 – 2010-01-17 21:58:41

1

如果这个设计的目的是保持运动学数据的历史那么设计是有意义的。尽管CAR_KINEMATIC表中似乎没有适合该用法的关键字。另一方面,如果这两个表格之间存在一对一的关系,那么该部门就没有任何价值。

0

我不确定这个问题是否完全清楚。如果您想主要介绍运动学的历史,那么适当的结构就是将数据标准化为汽车数据和航向数据。汽车数据可以独立更新,并且可能比运动学数据整体小得多。

如果您想保持汽车当前状态的平坦记录,而不是保持历史记录,那么保留原样的数据可能会更快。原因是编写整个记录在大多数情况下可能只需要一次写操作。将其拆分为两个表格可确保至少有两次写入操作。

在第一种情况下,您只是规范化数据;在第二种情况下,当前的数据结构可能是最有效的。

垂直分区实际上并不常用(除非是这样,请参见下文)。有些情况下,您可能需要使用垂直分区为:

  • 表是很宽的,只有一些是经常使用的。例如,如果您有一个包含250列的表,其中有5个更新频繁的状态更改,并且应用程序频繁使用一小部分列。

  • 出于安全原因,您可能混合使用1:1关系的机密数据和非敏感数据。您可以将机密数据移入具有不同权限集的另一个表中。从历史上看,并非所有DBMS平台都允许您在列级设置权限。

  • 前两项的组合,其中某些字段的更改必须记录到审计表中,但其他字段会更频繁地更新而不需要记录。为了避免生成大量虚假审计日志数据,可审计字段可以使用审计日志记录触发器存在于其自己的表中。

最后,你得到在某些情况下在后台垂直分区(即,不是在架构明确,但以这种方式物理存储的作品)。例如,许多DBMS平台将LOB与常规表数据分开存储,这会导致表的一种隐式垂直分区。

事实上,这种特殊的情况使得带有LOB列的表在开展操作时相当昂贵,因此将LOB列移入单独的表中可能是垂直分区的良好应用。

垂直分区的用途并不多,它总是会增加额外I/O的开销。您需要避免大量开销或者有特定的原因,例如安全问题,因此需要使用它。