Database 数据库分区-水平还是垂直-规范化和行拆分之间的区别?

Database 数据库分区-水平还是垂直-规范化和行拆分之间的区别?,database,database-design,database-performance,sharding,database-partitioning,Database,Database Design,Database Performance,Sharding,Database Partitioning,我试图掌握数据库分区的不同概念,这就是我对它的理解: 水平分区/分片:将一个表拆分为不同的表,其中将包含初始表中的行子集(如果按大陆拆分用户表,我看到了很多这样的示例,例如北美的子表,欧洲的子表等等)。每个分区位于不同的物理位置(理解“机器”)。 据我所知,水平分区和分片是完全相同的事情(?) 垂直分区:根据我的理解(),有两种垂直分区: 规范化(包括通过拆分表并使用外键链接表来删除数据库中的冗余) 行分割,这是我不理解的,规范化和行分割之间的区别是什么?这两种技术有什么不同之处 我在这篇文

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

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

垂直分区:根据我的理解(),有两种垂直分区:

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

  • 行分割,这是我不理解的,规范化和行分割之间的区别是什么?这两种技术有什么不同之处

我在这篇文章()中还读到,水平分区和垂直分区的区别在于,在第一个分区中,您通过添加更多的机器来扩展,而在第二个分区中,您通过向现有机器添加更多的电源(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,
    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时,可以应用这种分区。分区数据_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将表
数据
内部存储为两段(类似于两个表),具体取决于列
status
的值。例如,当您通常只查询一个分区的行时,可以应用这种分区
数据的方式,例如,状态为“A”的行(我们称之为活动行)。与以前一样,完全扫描速度更快(特别是当只有很少的活动行时),活动行(以及其他行)将连续存储(它们不会分散在与具有不同状态值的行共享的页面上,活动行更有可能位于页面缓存中。

数据库中的水平分区 保留所有字段,例如:表
Employees

  • 身份证
  • 名字
  • 地理位置
  • 电子邮件
  • 名称
  • 电话
例如:1.保存所有字段并在多台机器上分发记录。假设id=1-100000或100000-200000记录在一台机器上,并在多台机器上分发

为亚太、北美等地区保留单独的数据库

关键点:根据标准拾取行集

数据库中的垂直分区 它类似于标准化,将同一个表划分为多个表,并在需要时与联接一起使用

例如:
标识
名称
名称
放在一个表中,
电话
电子邮件
可能不常被访问,它们被放在另一个文件夹中

键:根据条件拾取列集。

  • 水平/垂直缩放与分区不同
水平缩放: 是关于向添加更多机器,以提高包括数据库在内的任何系统的响应能力和可用性。其想法是将工作负载分配到多台机器

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


Sameer Sukumaran

规范化和拆分的区别在于这样做的目的

规范化的主要目的是删除冗余数据,而行拆分的目的是分离所需的较少数据