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

时间:2013-12-05 00:16:40

标签: database database-design database-performance sharding database-partitioning

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

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

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

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

  • 行拆分,这是我不明白的,规范化行拆分之间有什么区别?这两种技术在哪些方面有所不同?

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

我很抱歉问题很多,但我有点困惑,因为我遇到的很多不同的网站都说不同的东西。

任何帮助澄清将不胜感激。使用几张表格进行清晰简单演示的任何链接也会非常有用。

4 个答案:

答案 0 :(得分:27)

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

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

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

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

垂直分区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) );

例如,当您在查询中很少需要列数据2时,可以应用此类分区。分区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) 
    );

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

答案 1 :(得分:20)

数据库中的水平分区

保留所有字段EG:表Employees具有

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

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

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

键:根据条件挑选行集

数据库中的垂直分区

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

EG: idnamedesignation放在一个表格中 可能不经常访问的phoneemail被放入另一个。

键:根据条件挑选一组列。

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

横向缩放:

是关于添加更多计算机,可以提高包括数据库在内的任何系统的响应能力和可用性。想法是将工作负载分配给多台计算机。

垂直缩放:

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

Sameer Sukumaran

答案 2 :(得分:0)

规范化和分裂之间的区别在于这样做的目的。

规范化的主要目的是删除冗余数据其中,行分割的目的是分离较少的必需数据。

例如: - 假设您有一个包含columns-id,Emp_name,Emp_address,Emp_phNo,Emp_other_data,Company_Name,Company_Address,Company_revenue的表All_Details。

现在,如果要对表进行规范化,则需要创建两个新表Employee_Details和Company_Details,并在表Employee_Details中保留company_id的外键。这样就可以删除多余的公司数据。

现在让我们谈谈行拆分。即使在规范化之后,您也只是访问employee_name和emp_phNo,但是您没有经常访问emp_address和emp_other_data。因此,为了提高性能,您将Employee_Details表拆分为两个表。 table1包含经常需要的数据(employee_name和emp_phNo),table2包含不太常用的数据(Emp_address,Emp_other_data)。两个表都具有相同的unique_key列,以便您可以使用unique_key重新创建表Employee_Details的任何行。这可以极大地提高您的系统性能。

答案 3 :(得分:0)

单个数据库出现问题时会出现问题。因此需要对其进行分区,以减少搜索空间,以便它可以更快地执行所需的操作。可以使用各种分区策略,例如:水平分区,垂直分区,基于散列的分区,基于查找的分区。与这些策略相比,水平,垂直缩放是不同的概念。

  1. 水平分区:它根据一些关键信息将给定的表/集合拆分为多个表/集合,这有助于获得正确的表,因为水平分区将在不同的节点上具有多个表/机器。例如:区域用户信息。

  2. 垂直分区:它将列分成多个部分,如上述答案之一所述,例如:与社交网络应用程序中的用户信息,赞,评论,朋友等相关的列。 / p>

  3. 基于哈希的分区:它使用哈希函数来决定表/节点,并在生成哈希时将关键元素作为输入。如果我们改变表的数量,则需要重新安排数据,这是昂贵的。因此,当您想要添加更多表/节点时会出现问题。

  4. 基于查找的分区:它使用查找表,有助于根据给定的输入字段重定向到不同的表/节点。我们可以在这种方法中轻松添加新的表/节点。

  5. 水平缩放与垂直缩放: 当我们设计任何应用程序时,我们也需要考虑扩展。我们将来如何处理大量流量?我们需要考虑内存消耗,延迟,CPU使用率,容错能力,弹性。垂直扩展可以增加更多资源,例如:cpu,内存到单台机器,以便它可以处理即将到来的流量。但是这种方法存在局限性,您无法添加超过特定限制的资源。水平扩展允许即将到来的流量分布在多个节点上。它需要在前面有负载均衡器,它基本上处理流量,并将流量导航到任何一个节点。水平扩展允许您添加足够数量的服务器,但您还需要这么多节点。