单表拆分

2021-07-27  by  

架构定义

单表数据量较大的时候,我们需要进行拆表,以减少单表的负荷,这时候如何管理拆分出的表就十分重要,决定了程序的维护难度。

使用

namespace App\Repository;

use App\Entity\User;
use PHPZlc\PHPZlc\Doctrine\ORM\Repository\AbstractDismantleTableRepository;

class UserRepository extends AbstractDismantleTableRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, User::class);
    }
}

将需要拆表的实体类Repository类继承AbstractDismantleTableRepository即可。

创建表

$this->getDoctrine()->getRepository('App:User')->dismantleMark('1')->createDismantleTable();

dismantleMark()方法用于设置分表标识。 为了分表标识生成表的稳定性,程序默认对分表标识进行m5。 你如果想要修改分表标识的使用,可以重写getDismantleTableName()

更新拆分表的结构

$this->getDoctrine()->getRepository('App:User')->updateAllDismantleTable();

源表的结构发生变化的时候,我们需要将所有拆分出的表结构进行更新。

获取全部的拆分表表名

$this->getDoctrine()->getRepository('App:User')->getAllDismantleTable();

当你重写了getDismantleTableName()后,你需要关注这个方法,做对应的调整。

拆分表的插入,查询写法示例

$userRepository = $this->getDoctrine()->getRepository('App:User')->dismantleMark('1');

//查询
$userRepository->findAll();

//插入
$user = new User();
$user
    ->setName('用户');

$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
  1. 使用dismantleMark()可以重新指定分表。
  2. 查询,插入,编辑,删除和正常的表一样操作,只需要指定好分表标识就好。

找到错别字了?本文档有什么问题么?分叉并编辑 它 !

CJayhe

谢谢您的赞赏~

使用微信扫描二维码完成支付

抱歉弹框打扰,系统检测到您今日累计浏览时长已达120秒。如果我们的项目对您有帮助,在 关闭窗口之前,希望能够阅读弹框内容,帮助我们变得更好。

一个成功的项目,实现功能只是基础,合理的架构,对资源的调度能力才是灵魂。 PHPZlc, 致力于在Symfony的基础上提供“知行合一”的项目开发方案。

如果您有关切问题和好的想法:

提交

如果您想帮助我们,可以为我们点亮星星,也可以提供资金支持。

您还可以通过以下渠道,关注我们,获取最新的框架动态,帮助项目获取人气,扩大影响力。

开源伙伴招募:https://phpzlc.com/blog/11.html

由于我们无法获取您是否已经是我们的会员了,所以此弹框每日都会弹出一次,关闭