首页 文章

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

提问于
浏览
31

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

Horizontal Partitioning/Sharding :将表拆分到不同的表中,该表将包含初始表中的行的子集(如果按大陆拆分Users表,我已经看到了很多示例,例如北美的子表,另一个用于北美的子表欧洲等......)每个分区都在不同的 physical location (了解'machine') . 据我所知,水平分区和分片是完全相同的(?) .

Vertical Partitioning :根据我的理解(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)来扩展机器,是一个正确的定义?我认为这两种技术之间的区别在于你分割表格的方式 .

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

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

4 回答

  • 25

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

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

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

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

    分区的一种方法 data vertically :将其拆分如下:

    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 horizontally 的一种方法:

    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 的值 . 这种分区方式可以应用,例如,当您通常只查询一个分区的行时,例如,状态'A'行(让's call them active rows). Like before, full scans will be faster (particularly if there are only few active rows), the active rows (and the other rows resp.) are stored contiguously (they won'分散在它们与不同状态值的行共享的页面周围,并且它是活动行更有可能在页面缓存中 .

  • 19

    数据库中的水平分区

    保持所有字段EG:表 Employees

    • id,

    • 名字,

    • 地理位置,

    • 电子邮件,

    • 指定,

    • 电话

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

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

    Key:Picking set of rows based on a criteria

    数据库中的垂直分区

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

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

    Key:Picking set of columns based on a criteria.

    • Horizontal/Vertical Scaling is different from partitioning

    水平缩放:

    是关于 adding more machines to 能够提高包括数据库在内的任何系统的响应能力和可用性 . 这个想法是将工作负载分配给多台机器 .

    垂直缩放:

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

    Sameer Sukumaran

  • 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的任何行 . 这可以大大提高您的系统性能 .

  • 0

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

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

    • Vertical partitioning :它将列分成多个部分,如上述答案之一所述,例如:与社交网络应用程序中的用户信息,喜欢,评论,朋友等相关的列 .

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

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

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

相关问题