数据库分区 – 水平与垂直 – 归一化和行拆分之间的差异?

前端之家收集整理的这篇文章主要介绍了数据库分区 – 水平与垂直 – 归一化和行拆分之间的差异?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图把握数据库分区的不同概念,这是我所理解的:

水平分区/分片:将表分解为不同的表,其中将包含初始表中的行的一部分(我已经看到很多,如大陆分裂Users表,例如北美的一个子表,另一个为欧洲等).每个分区处于不同的物理位置(了解“机器”).
据我所知,水平分区和分片是完全相同的东西(?).

垂直分区:根据我的理解(http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx),有两种垂直分区:

>规范化(其中包括通过拆分表并将其与外键链接来从数据库删除冗余).
> Row Splitting,这里是我不明白的,Normalization和Row Splitting有什么区别?这两种技术在哪些方面有所不同?

我还在这篇文章(Difference between scaling horizontally and vertically for databases)中看到,水平分区和垂直分区之间的区别在于,首先通过添加更多的机器进行扩展,而在第二个中,您可以通过向现有的增加更多的功率(cpu,RAM)机器是正确的定义?我认为这两种技术的核心区别在于您拆分表的方式.

我很抱歉的问题的负担,但我有点困惑,因为我遇到的很多不同的网站说不同的事情.

任何帮助澄清将不胜感激.任何链接到一个清晰简单的示范与几个表也将是非常有帮助的.

解决方法

分区是一个相当一般的概念,可以在许多情况下应用.当它考虑关系数据的分区时,通常是指逐行(水平)或逐列(垂直)分解表.

垂直分割(又称行分割)使用与数据库规范化相同的分割技术,但通常的术语(垂直/水平)数据分区是指物理优化,而归一化是概念层面的优化.

因为你要求一个简单的示范 – 假设你有一个这样的表:

create table data (
    id integer primary key,status char(1) not null,data1 varchar2(10) not null,data2 varchar2(10) not null);

垂直分割数据的一种方法:将其拆分如下:

create table data_main (
    id integer primary key,data1 varchar2(10) not null );

create table data_rarely_used (
    id integer primary key,data2 varchar2(10) not null,foreign key (id) references data_main (id) );

例如,当您的查询中很少需要列数据2时,可以应用这种分区.分区data_main将占用更少的空间,因此全表扫描将更快,并且更有可能适合DBMS页面缓存.缺点:当您必须查询所有数据列时,您实际上必须加入表,查询原始表格将会更昂贵.

请注意,您按照与规范化表格相同的方式拆分列.然而,在这种情况下,数据可能已经被归一化为3NF(甚至BCNF和4NF),但是您决定进一步将其拆分为物理优化的原因.

使用Oracle语法水平分区数据的一种方式:

create table data (
    id integer primary key,status char(1),data1 varchar2(10),data2 varchar2(10) )
    partition by list (status) ( 
       partition active_data values ( 'A' ),partition other_data values(default) 
    );

这将告诉DBMS根据列状态的值将表数据内部存储在两个段(如两个表)中.例如,当您通常只查询一个分区的行,例如状态“A”行(让我们称之为活动行)时,可以应用这种分区数据的方法.像以前一样,完全扫描将更快(特别是如果只有少数活动行),活动行(以及其他行)可以连续存储(它们不会分散在它们与不同行的行共享的页面之间)状态值,并且活动行更有可能在页面缓存中.

猜你在找的MsSQL相关文章