Maison php教程 php手册 ThinkPHP中的分表使用

ThinkPHP中的分表使用

Jun 07, 2016 am 11:35 AM

讲讲ThinkPHP中的分表使用
数据分表

对于大数据量的应用,经常会对数据进行分表,有些情况是可以利用数据库的分区功能,但并不是所有的数据库或者版本都支持,因此我们可以利用ThinkPHP内置的数据分表功能来实现。帮助我们更方便的进行数据的分表和读取操作。

和数据库分区功能不同,内置的数据分表功能需要根据分表规则手动创建相应的数据表。

在需要分表的模型中定义partition属性即可。

protected $partition = array(
'field' => 'name',// 要分表的字段 通常数据会根据某个字段的值按照规则进行分表
'type' => 'md5',// 分表的规则 包括id year mod md5 函数 和首字母
'expr' => 'name',// 分表辅助表达式 可选 配合不同的分表规则
'num' => 'name',// 分表的数目 可选 实际分表的数量
);
定义好了分表属性后,我们就可以来进行CURD操作了,唯一不同的是,获取当前的数据表不再使用getTableName方法,而是使用getPartitionTableName方法,而且必须传入当前的数据。然后根据数据分析应该实际操作哪个数据表。因此,分表的字段值必须存在于传入的数据中,否则会进行联合查询。

这是tp3.2.3官方文档介绍的,对于还未阅读tp源代码的coder,光看这几句话其实是很难理解如何在tp中使用分表技术的。之前我有专门了解过分表原理,再结合tp的源代码,我和分享一下我是怎么使用tp中的分表。
一、准备工作
1、安装最新的tp3.2.3框架 http://thinkphp.cn/down/framework.html
2、按自己的喜欢新建测试数据库(例如: thinkphp),接下来建表,因为我只需要完成功能演示就行,因此我就简单地建了tp_user、tp_blog_1、tp_blog_2。表结构如下:
表user:
id: 用户id, 自增,我们blog分表就是根据这个id去定位表的;
username: 账号

表tp_blog_1:
id: 博客id, 自增
uid: 作者用户 id
title: 标题
content: 内容

表tp_blog_2和表tp_blog_1一样
可以发现,我们是对blog表进行了分表操作,表的数量是2。
手动添加一些user表数据,演示要用到。

二、核心部分:建立模型
user表的模型和正常情况一样,这里不作说明。
重点在于blog表的模型,我直接先上BlogModel:<?php <br /> namespace Home\Model;<br> use Think\Model\AdvModel;<br> class BlogModel extends AdvModel{<br> <br>    protected $tableName = 'blog';<br>    Protected $autoCheckFields = false;  //一定要关闭字段缓存,不然会报找不到表的错误<br> <br>    protected $partition = array(<br>       'field' => 'uid',// 要分表的字段 通常数据会根据某个字段的值按照规则进行分表,我们这里按照用户的id进行分表<br>       'type' => 'mod',// 分表的规则 包括id year mod md5 函数 和首字母,此处选择mod(求余)的方式<br>       'expr' => '',// 分表辅助表达式 可选 配合不同的分表规则,这个参数没有深入研究<br>       'num' => '2',// 分表的数目 可选 实际分表的数量,在建表阶段就要确定好数量,后期不能增减表的数量<br>    );<br> <br>     /**<br>      * 计算在哪张表<br>      * @param array $data<br>      * @return \Think\Model<br>      */<br>    public function computeTable($data = []){<br>       $data = empty($data) ? $_POST : $data;<br>       $table = $this->getPartitionTableName($data);<br>       return $this->table($table);<br>    }这样我们的分表模型就可以工作了,接下来进行增删改查的演示操作。

三、演示
1、插入数据:
在BlogModel中新增函数addOne:/**<br>  * 添加一条数据<br>  * @param array $data<br>  * @return bool|int<br>  */<br> public function addOne($data=[]){<br>     if(empty($data[$this->partition['field']])){<br>         E('缺少' . $this->partition['field']);<br>     }<br>     $data['id'] = intval($this->computeTable()->max('id')) + 1;<br>     if($this->create($data)){<br>         $id = $this->computeTable($data)->add();<br>         if($id === false){<br>             $this->error = '插入数据错误';<br>             return false;<br>         }else{<br>             return $data['id'];<br>         }<br>     }<br>     return false;<br> } 在Home/Controller/IndexController文件新增操作addBlog:/**<br>  * 新增数据演示<br>  */<br> public function addBlog($uid=1){<br>     $blogM = D('Blog');<br>     for($i=1; $i          $this->show("<br>添加第{$i}条数据<br>");<br>         $data = ['title'=>'标题'.$i, 'content'=>'内容内容', 'uid'=>$uid];<br> <br>         $result = $blogM->addOne($data);<br>         if($result !== false){<br>             $this->show('插入数据后的id为:'.$result);<br>         }else{<br>             $this->show('插入数据失败,失败原因:'.$blogM->getError());<br>         }<br>     }<br> <br> }打开浏览器访问: 域名/index.php?s=/home/index/addBlog/uid/1 ,可以自行核对是否达到预期的效果。

2、获取所有博客:
在BlogModel中新增函数getAll:/**<br>  * 获取所有记录<br>  */<br> public function getAll(){<br> <br>     return $this->computeTable()->select();<br> }在Home/Controller/IndexController文件新增操作getBlogs:/**<br>  * 获取所有数据演示<br>  */<br> public function getBlogs(){<br>     $blogM = D('Blog');<br>     $list = $blogM->getAll();<br>     dump($list);<br> }浏览器访问: 域名/index.php?s=/home/index/getBlogs,可以自行核对是否达到预期的效果。

3、根据条件获取多条数据
在BlogModel中新增函数getList:/**<br>  * 条件查询列表<br>  * @param $map<br>  * @return mixed<br>  */<br> public function getList($map){<br>     if(empty($map[$this->partition['field']])){<br>         E('缺少' . $this->partition['field']);<br>     }<br> <br>     return $this->computeTable($map)->where($map)->select();<br> }在Home/Controller/IndexController文件新增操作getBlogByUid:/**<br>  * 根据条件查询数据演示<br>  * @param int $uid<br>  */<br> public function getBlogsByUid($uid = 1){<br>     $blogM = D('Blog');<br>     $list = $blogM->getList(['uid' => $uid]);<br>     dump($list);<br> }浏览器访问: 域名/index.php?s=/home/index/getBlogsByUid/uid/1,可以自行核对是否达到预期的效果。

4、查询单条记录
在BlogModel中新增函数getOne:/**<br>  * 根据查询条件获取一条记录<br>  * @param $map<br>  * @return mixed<br>  */<br> public function getOne($map){<br>     if(empty($map[$this->partition['field']])){<br>         E('缺少' . $this->partition['field']);<br>     }<br>     return $this->computeTable($map)->where($map)->find();<br> }在Home/Controller/IndexController文件新增操作blogDetail:/**<br>  * 查询一条数据演示<br>  * @param int $uid<br>  * @param int $blog_id<br>  */<br> public function blogDetail($uid = 1, $blog_id=1){<br>     $blogM = D('Blog');<br>     $data = $blogM->getOne(['uid' => $uid, 'id' => $blog_id]);<br>     dump($data);<br> }浏览器访问: 域名/index.php?s=/home/index/blogdetail/uid/1/blog_id/1,可以自行核对是否达到预期的效果。

5、更新一条记录
在BlogModel中新增函数updateOne:/**<br>  * 更新一条记录<br>  * @param $map<br>  * @param $data<br>  * @return bool<br>  */<br> public function updateOne($map, $data){<br>     if(empty($map[$this->partition['field']])){<br>         E('缺少' . $this->partition['field']);<br>     }<br>     if($this->create($data)){<br>         $res = $this->computeTable($map)->save($data);<br>         if($res === false){<br>             $this->error = '更新数据出错';<br>         }else{<br>             return $res;   //更新的数据条数<br>         }<br>     }<br>     return false;<br> }在Home/Controller/IndexController文件新增操作updateBlog:/**<br>  * 更新一条记录演示<br>  * @param int $uid<br>  * @param int $blog_id<br>  */<br> public function updateBlog($uid=1, $blog_id=1){<br>     $blogM = D('Blog');<br>     $map = ['uid'=>$uid, 'id'=>$blog_id];<br>     $this->show("id为".$blog_id."的博客在修改之前为<br>");<br>     $blog = $blogM->getOne($map);<br>     dump($blog);<br> <br>     $this->show("id为".$blog_id."的博客在修改之后为<br>");<br>     $data = ['title' => '我被修改了', 'id' => $blog_id];<br>     $res = $blogM->updateOne(['uid' => $uid], $data);<br>     if($res === false){<br>         dump($blogM->getError());<br>     }else{<br>         $blog = $blogM->getOne($map);<br>         dump($blog);<br>     }<br> }浏览器访问: 域名/index.php?s=/home/index/updateblog/uid/1/blog_id/1,可以自行核对是否达到预期的效果。

6、删除一条数据
在BlogModel中新增函数delOne:/**<br>  * 删除一条记录<br>  * @param $map<br>  * @return bool|mixed<br>  */<br> public function delOne($map){<br>     if(empty($map[$this->partition['field']])){<br>         E('缺少' . $this->partition['field']);<br>     }<br>     $res = $this->computeTable($map)->where($map)->delete();<br>     if($res === false){<br>         $this->error = '删除数据出错';<br>         return false;<br>     }else{<br>         return $res;   //删除数据个数<br>     }<br> }在Home/Controller/IndexController文件新增操作delBlog:/**<br>  * 删除一条数据演示<br>  * @param int $uid<br>  * @param int $blog_id<br>  */<br> public function delBlog($uid = 1, $blog_id=1){<br>     $blogM = D('Blog');<br>     $map = ['uid' => $uid, 'id' => $blog_id];<br>     $this->show("准备要删除的博客<br>");<br>     dump($blogM->getOne($map));<br> <br>     $this->show("删除结果<br>");<br>     $res = $blogM->delOne($map);<br>     dump($res);<br> }浏览器访问: 域名/index.php?s=/home/index/delblog/uid/1/blog_id/1,可以自行核对是否达到预期的效果。

以上只例举了一些其他操作,其他tp模型具有的操作可以举一反三得到,希望各自去使用。

AD:真正免费,域名+虚机+企业邮箱=0元

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1664
14
Tutoriel PHP
1268
29
Tutoriel C#
1243
24
Découvrez des exemples de code d'introduction à la programmation Python. Découvrez des exemples de code d'introduction à la programmation Python. Jan 04, 2024 am 10:50 AM

Découvrez la programmation Python avec des exemples de code d'introduction. Python est un langage de programmation facile à apprendre mais puissant. Pour les débutants, il est très important de comprendre les exemples de code d’introduction à la programmation Python. Cet article vous fournira quelques exemples de code concrets pour vous aider à démarrer rapidement. Imprimer HelloWorldprint("HelloWorld") Il s'agit de l'exemple de code le plus simple en Python. La fonction print() est utilisée pour afficher le contenu spécifié

Exemples de programmation en langage Go : exemples de code dans le développement Web Exemples de programmation en langage Go : exemples de code dans le développement Web Mar 04, 2024 pm 04:54 PM

"Exemples de programmation en langage Go : exemples de code dans le développement Web" Avec le développement rapide d'Internet, le développement Web est devenu un élément indispensable dans diverses industries. En tant que langage de programmation doté de fonctions puissantes et de performances supérieures, le langage Go est de plus en plus privilégié par les développeurs en développement Web. Cet article expliquera comment utiliser le langage Go pour le développement Web à travers des exemples de code spécifiques, afin que les lecteurs puissent mieux comprendre et utiliser le langage Go pour créer leurs propres applications Web. 1. Serveur HTTP simple Commençons par un

Java implémente un code de tri à bulles simple Java implémente un code de tri à bulles simple Jan 30, 2024 am 09:34 AM

L'exemple de code le plus simple du tri à bulles Java est un algorithme de tri courant. Son idée de base est d'ajuster progressivement la séquence à trier en une séquence ordonnée grâce à la comparaison et à l'échange d'éléments adjacents. Voici un exemple de code Java simple qui montre comment implémenter le tri à bulles : publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

Variables PHP en action : 10 exemples concrets d'utilisation Variables PHP en action : 10 exemples concrets d'utilisation Feb 19, 2024 pm 03:00 PM

Les variables PHP stockent les valeurs pendant l'exécution du programme et sont cruciales pour créer des applications WEB dynamiques et interactives. Cet article examine en profondeur les variables PHP et les montre en action avec 10 exemples réels. 1. Stocker l'entrée de l'utilisateur $username=$_POST["username"];$passWord=$_POST["password"]; Cet exemple extrait le nom d'utilisateur et le mot de passe de la soumission du formulaire et les stocke dans des variables pour un traitement ultérieur. 2. Définissez la valeur de configuration $database_host="localhost";$database_username="username";$database_pa

Guide d'interconnexion Huawei Cloud Edge Computing : exemples de code Java pour implémenter rapidement des interfaces Guide d'interconnexion Huawei Cloud Edge Computing : exemples de code Java pour implémenter rapidement des interfaces Jul 05, 2023 pm 09:57 PM

Guide d'interconnexion Huawei Cloud Edge Computing : exemples de code Java pour implémenter rapidement des interfaces Avec le développement rapide de la technologie IoT et l'essor de l'informatique de pointe, de plus en plus d'entreprises commencent à s'intéresser à l'application de l'informatique de pointe. Huawei Cloud fournit des services d'informatique de pointe, offrant aux entreprises des ressources informatiques hautement fiables et un environnement de développement pratique, facilitant ainsi la mise en œuvre des applications d'informatique de pointe. Cet article explique comment implémenter rapidement l'interface informatique de pointe Huawei Cloud via le code Java. Tout d’abord, nous devons préparer l’environnement de développement. Assurez-vous que le kit de développement Java est installé (

Comment utiliser PHP pour écrire le code de la fonction de gestion des stocks dans le système de gestion des stocks Comment utiliser PHP pour écrire le code de la fonction de gestion des stocks dans le système de gestion des stocks Aug 06, 2023 pm 04:49 PM

Comment utiliser PHP pour écrire le code de la fonction de gestion des stocks dans le système de gestion des stocks La gestion des stocks est un élément indispensable dans de nombreuses entreprises. Pour les entreprises disposant de plusieurs entrepôts, la fonction de gestion des stocks est particulièrement importante. En gérant et en suivant correctement les stocks, les entreprises peuvent répartir les stocks entre différents entrepôts, optimiser les coûts d'exploitation et améliorer l'efficacité de la collaboration. Cet article explique comment utiliser PHP pour écrire du code pour les fonctions de gestion d'entrepôt et vous fournit des exemples de code pertinents. 1. Établissez la base de données avant de commencer à écrire le code de la fonction de gestion des entrepôts de stocks.

Du débutant au compétent : implémentation de code de structures de données couramment utilisées en langage Go Du débutant au compétent : implémentation de code de structures de données couramment utilisées en langage Go Mar 04, 2024 pm 03:09 PM

Titre : Du débutant à la maîtrise : implémentation du code des structures de données couramment utilisées dans le langage Go. Les structures de données jouent un rôle essentiel dans la programmation et constituent la base de la programmation. Dans le langage Go, il existe de nombreuses structures de données couramment utilisées, et maîtriser la mise en œuvre de ces structures de données est crucial pour devenir un bon programmeur. Cet article présentera les structures de données couramment utilisées dans le langage Go et donnera des exemples de code correspondants pour aider les lecteurs à démarrer et à maîtriser ces structures de données. 1. Array Array est une structure de données de base, qui est un groupe du même type.

Conseils et exemples : Apprenez à implémenter l'algorithme de tri par sélection en Java Conseils et exemples : Apprenez à implémenter l'algorithme de tri par sélection en Java Feb 18, 2024 am 10:52 AM

Guide de rédaction de code et exemples de la méthode de tri par sélection Java Le tri par sélection est un algorithme de tri simple et intuitif. L'idée est de sélectionner à chaque fois l'élément le plus petit (ou le plus grand) parmi les éléments non triés et de l'échanger jusqu'à ce que tous les éléments soient triés. Cet article fournira un guide d'écriture de code pour le tri des sélections et joindra un exemple de code Java spécifique. Principe de l'algorithme Le principe de base du tri par sélection est de diviser le tableau à trier en deux parties, triée et non triée. A chaque fois, le plus petit (ou le plus grand) élément est sélectionné dans la partie non triée et placé à la fin de la partie triée. Répétez ce qui précède

See all articles