数据库分区 - 水平与垂直 - 规范化和行分裂之间的区别?

duk*_*ble 34 database database-design sharding database-performance database-partitioning

我试图掌握数据库分区的不同概念,这就是我对它的理解:

水平分区/分片:将表拆分到不同的表中,该表将包含初始表中的行的子集(如果按大陆分割Users表,我已经看到了很多示例,如北美的子表,另一个为欧洲等...).每个分区位于不同的物理位置(了解"机器").据我所知,水平分区和分片是完全相同的(?).

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

  • 规范化(包括通过拆分表并使用外键链接来从数据库中删除冗余).

  • Row Splitting,这是我不明白的,NormalizationRow Splitting有什么区别?那两种技术在哪些方面有所不同?

我还读过这篇文章(数据库水平和垂直缩放之间的差异),水平分区和垂直分区之间的区别在于,您通过添加更多机器来扩展第一个,而在第二个中您通过添加更多功率进行扩展( CPU,RAM)到你现有的机器,是一个正确的定义?我认为这两种技术之间的核心区别在于您分割表格的方式.

对于大量问题我很抱歉,但是我有点困惑,因为我遇到的很多不同的网站都说不同的东西.

任何帮助澄清将不胜感激.任何带有几个表格的简单演示的链接也会非常有用.

Fab*_*ian 27

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

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

既然你要求一个简单的演示 - 假设你有一个这样的表:

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

data 垂直分区的一种方法:按如下方式拆分:

create table data_main (
    id integer primary key,
    status char(1) not null,
    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) );
Run Code Online (Sandbox Code Playgroud)

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

请注意,您正在以与规范化表格时相同的方式拆分列.但是,在这种情况下data,已经可以将其标准化为3NF(甚至BCNF和4NF),但您决定进一步拆分它以进行物理优化.

使用Oracle语法data 水平分区的一种方法:

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) 
    );
Run Code Online (Sandbox Code Playgroud)

这将告诉DBMS data在两个段(如两个表)内部存储表,具体取决于列的值status.这种分区data方式可以应用,例如,当您通常只查询一个分区的行时,例如状态"A"行(让我们称之为活动行).像以前一样,完全扫描会更快(特别是如果只有很少的活动行),活动行(和其他行resp.)是连续存储的(它们不会分散在它们与不同行共享的页面周围状态值,活动行更有可能位于页面缓存中.


小智 20

数据库中的水平分区

保持所有领域EG:表Employees

  • ID,
  • 名称,
  • 地理位置 ,
  • 电子邮件,
  • 指定,
  • 电话

EG:1.保留所有字段并在多台machine.ay id = 1-100000或100000-200000记录中分配记录,每台记录在一台机器上并分布在多台机器上.

EG:2.为EG区域保留单独的数据库:亚太地区,北美

密钥:根据标准挑选行集

数据库中的垂直分区

它类似于规范化,其中同一个表被分成多个表,并在需要时与连接一起使用.

EG: , ,id 放在一个表,这可能不被频繁访问被放在另一个.namedesignation
phoneemail

关键:根据标准挑选一组列.

  • 水平/垂直缩放与分区不同

水平缩放:

为了增加更多的机器,以提高包括数据库在内的任何系统的响应能力和可用性.这个想法是将工作负载分配给多台机器.

垂直缩放:

是以CPU,内存形式向现有机器或机器添加更多功能,以提高包括数据库在内的任何系统的响应能力和可用性.在虚拟机设置中,可以虚拟配置,而不是添加真正的物理机.

Sameer Sukumaran