数据库分区 - 水平与垂直 - 规范化和行拆分之间的区别?
Posted
技术标签:
【中文标题】数据库分区 - 水平与垂直 - 规范化和行拆分之间的区别?【英文标题】:Database partitioning - Horizontal vs Vertical - Difference between Normalization and Row Splitting? 【发布时间】:2013-12-21 17:45:15 【问题描述】:我正在尝试掌握数据库分区的不同概念,这就是我对它的理解:
水平分区/分片:将表拆分为不同的表,其中将包含初始表中行的子集(如果将用户表拆分为大陆,例如北美的子表,欧洲的另一个子表,等等...)。每个分区位于不同的物理位置(了解“机器”)。 据我了解,水平分区和分片是完全相同的东西(?)。
垂直分区:据我了解(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)到您现有的机器,这是一个正确的定义吗?我认为这两种技术之间的核心区别在于您拆分表格的方式。
对于这么多问题,我感到很抱歉,但我有点困惑,因为我遇到的许多不同的网站都有不同的说法。
任何帮助澄清将不胜感激。任何指向带有几张表格的清晰简单演示的链接也将非常有帮助。
【问题讨论】:
这个问题更适合dba.stackexchange.com 【参考方案1】:分区是一个相当笼统的概念,可以在许多情况下应用。在考虑关系数据的分区时,通常是指按行(水平)或按列(垂直)分解表。
垂直分区,也称为行拆分,使用与数据库规范化相同的拆分技术,但通常术语(垂直/水平)数据分区是指物理优化,而规范化是对概念层面。
既然您要求进行简单的演示 - 假设您有一张这样的表格:
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) );
可以应用这种分区,例如,当您在查询中很少需要列 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)
);
这将告诉 DBMS 在内部将表 data
存储在两个段中(如两个表),具体取决于列 status
的值。这种分区data
的方式可以应用,例如,当您通常只查询一个分区的行时,例如状态“A”行(我们称它们为活动行)。像以前一样,完全扫描会更快(特别是如果只有很少的活动行),活动行(以及其他行)是连续存储的(它们不会分散在与不同行共享的页面周围)状态值,并且活动行更有可能在页面缓存中。
【讨论】:
【参考方案2】:数据库中的水平分区
保留所有字段 EG:Table Employees
has
EG:1. 将所有字段保存在多台机器上并分布记录。比如 id= 1-100000 或 100000-200000 条记录在一台机器上并分布在多台机器上。
EG:2.为区域 EG:亚太、北美保留单独的数据库
键:根据条件选择行集
数据库中的垂直分区
它类似于规范化,将同一个表分成多个表并在需要时与连接一起使用。
例如:
id
, name
, designation
放在一个表中,phone
, email
可能不经常访问的放在另一个表中。
键:根据条件选择列集。
水平/垂直缩放不同于分区水平缩放:
是关于添加更多机器以提高包括数据库在内的任何系统的响应能力和可用性。这个想法是将工作负载分配到多台机器上。
垂直缩放:
是以 CPU、内存的形式向现有机器或机器添加更多功能,以提高包括数据库在内的任何系统的响应能力和可用性。在虚拟机设置中,可以虚拟配置它,而不是添加真实的物理机器。
Sameer Sukumaran
【讨论】:
【参考方案3】:Normalization 和 split 的区别在于这样做的目的。
Normalization 的主要目的是去除冗余数据 where as Row split 的目的是分离出较少需要的数据。
例如:- 假设您有一个表 All_Details,其中包含列 - id、Emp_name、Emp_address、Emp_phNo、Emp_other_data、Company_Name、Company_Address、Company_revenue。
现在,如果您想规范化表,您将创建两个新表 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 的任何行。这可以极大地提高您的系统性能。
【讨论】:
【参考方案4】:当单个数据库开始变得庞大时,就会出现问题。因此需要对它进行分区,以减少搜索空间,以便它可以更快地执行所需的操作。可用的分区策略有多种,例如:水平分区、垂直分区、基于散列的分区、基于查找的分区。与这些策略相比,水平、垂直缩放是不同的概念。
水平分区:它根据一些关键信息将给定的表/集合拆分为多个表/集合,这有助于获得正确的表,因为水平分区将在不同节点上有多个表/机器。例如:区域明智的用户信息。
垂直分区:如上述答案之一所述,它将列分为多个部分,例如:与社交网络应用程序中的用户信息、喜欢、cmets、朋友等相关的列。
Hash based partitioning : 它使用哈希函数来决定表/节点,并在生成哈希时将关键元素作为输入。如果我们改变表的数量,它需要重新排列数据,这是昂贵的。所以当你想添加更多的表/节点时就会出现问题。
基于查找的分区:它使用查找表,有助于根据给定的输入字段重定向到不同的表/节点。我们可以通过这种方法轻松添加新表/节点。
水平缩放与垂直缩放: 当我们设计任何应用程序时,我们也需要考虑缩放。未来我们将如何处理巨大的流量?我们需要考虑内存消耗、延迟、cpu 使用率、容错性和弹性。垂直扩展为单台机器添加更多资源,例如:cpu、内存,以便它可以处理即将到来的流量。但是这种方法有局限性,你不能添加超过一定限制的资源。水平扩展允许传入的流量分布在多个节点上。它需要在前面有负载均衡器,基本上处理流量,并将流量导航到任何一个节点。水平扩展允许您添加足够数量的服务器,但您也需要这么多节点。
【讨论】:
以上是关于数据库分区 - 水平与垂直 - 规范化和行拆分之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章