表格和表组 
==========================



表（Table） 
-----------------

最基本的数据库对象，OceanBase 数据库的表都是关系表。

每个表由若干行记录组成，每一行有相同的预先定义的列。用户通过 SQL 语句对表进行增、删、查、改等操作。通常，表的若干列会组成一个主键，主键在整个表的数据集合内唯一。

分区（Partition） 
----------------------

分区是物理数据库设计技术，它的操作对象是表。实现分区的表，我们称之为分区表。

表分布在多个分区上。当一个表很大的时候，可以水平拆分为若干个分区，每个分区包含表的若干行记录。根据行数据到分区的映射关系不同，分为 hash 分区、range 分区（按范围）、key 分区等。每一个分区，还可以用不同的维度再分为若干分区，叫做二级分区。例如，交易记录表，按照用户 ID 分为若干 hash 分区，每个一级 hash 分区再按照交易时间分为若干二级 range 分区。

表组（TableGroup） 
-----------------------

表格组。每个表都可能有自己所属的表格组。

TableGroup 是一个逻辑概念，它和物理数据文件没有关联关系，Table Group 只影响表分区的调度方法，OceanBase 数据库会优先把属于同一个 Table Group 的相同分区号的分区，调度到同一台节点上，以减少跨节点分布式事务。

Table Group 不是一个物理对象，它是一个逻辑概念，表示一组表，或者说是表的集合。属于这样一个集合的表，需要满足一定的约束：所有表必须拥有相同的 Locality（副本类型、个数及位置），相同的 Primary Zone（leader 位置及其优先级），以及相同的分区方式。

Partition Group 
------------------------

通过定义 TableGroup，用户可以控制一组表在物理存储上的 **临近关系** 。对于包含分区表的 TableGroup，它由若干个 Partition Group 组成。称 TableGroup 的每个分区表中下标相同的一组分区为 Partition Group。属于同一个 Partition Group 的所有 Partition，系统会通过自动调度使它们位于同一台 OBServer 服务器上，且这些分区副本的 leader 也位于一台 OBServer 上。

除了用来定义"临近"关系，分区表本身隐含有"分片"的作用，要求系统在调度时，还会把同一个TableGroup 的不同 Partition Group 尽量在多个可用的机器间分散来开，以支持水平自动扩展。同时 Partition Group 是负载均衡和leader切换等操作的最小执行单元。

对于属于一个 TableGroup 的不同 Partition Group，TableGroup 的概念无法定义和表达 Partition Group 之间的 **临近关系** ；也就是说，用户无法控制一个分区表的多个分区间是否聚集在一起。相反，RS 会让他们尽可能分散开。
