无限级分类数据 ---- 本文章中的算法使用的都是以下数据 站长源码网 $array = [ 2....使用引用算法转为无限级分类树 ---- $data = getTree($data); /** 收藏 | 0点赞 | 0打赏
无限级分类是很常见的功能,算法的好坏对于获取分类树的性能起到决定性的作用。...尤其当分类数据和层级多时,一个糟糕的算法将使服务器不堪重负 以下用laravel实现无限级分类功能,包括: 数据表设计 填充模拟数据 生成分类树 分类树的后台维护 数据表设计 字段名 描述 id 主键id...name 类目名称 parent_id 父类目 ID is_directory 是否拥有子类目 level 当前类目层级 path 该类目所有父类目 id 为什么要用level与path 无限级分类中...id, 用 - 连接'); $table->timestamps(); }); } 执行迁移创建数据表 $ php artisan migrate 填充模拟数据...数据填充结果 生成分类树 分类树是一个通用的功能,适合将其封装为一个服务,创建CategoryService类
♖背景 最近复习算法,在此对无限级分类的实现方法稍作整理,当然也是参考了道友的经验,目测适合实际的项目应用,当然,也有不少公司的笔试题还会涉及到呢,有何问题,欢迎各位道友指摘 … 操作环境:Win10...首先,实现无限级分类的方式有: 以父ID设计,运用递归实现的方式 以全路径实现的无限分类方式 ②....其次,数据表设计思路 对应于上述的两种实现方式,那么在数据表设计时也可以有两种方式,参考所给的数据表截图 如果采用 父ID方式,字段只需使用 "id,pid,cate_name" 的主要三个即可 如果采用...父ID 方式 核心处理代码如下,注意参数备注信息,便于正确的调用 /** * 数据库设计 递归方式 获取无限极分类数据 由上到下进行获取 * @param int $pid...deepCatesForDown(0,6); $this->assign('cateListDown',$cateListDown); $this->display(); 前端Html数据显示参考: 递归方式获取 无限级分类数据
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 sql: 品牌表: 商品分类表: 分类与品牌表关联表: 三张表之间的联系: 解析: t_category_brand...", INDEX idx_parent_id(parent_id), INDEX idx_sort(sort) t_brand 品牌表: 分类表: 品牌分类表: sql: 品牌表: CREATE...parent_id), INDEX idx_sort(sort) ) COMMENT="商品分类表"; 分类与品牌表关联表: CREATE TABLE t_category_brand( category_id...) ) COMMENT="分类与品牌关联表"; 三张表之间的联系: 举个例子:分类表的手机。...品牌分类表 解析: t_category_brand 在t_category_brand表中,category_id的意思是在category中找id==3的分类(手机)。
摘要 在实际项目中经常要用到无限级分类,如多级分类、导航表等。PHP 实现无限级分类通常有两种实现方式,一种是利用path字段(pid+id)标识当前层级;另一种是利用递归循环pid的方式。...PHP 实现无限级分类 – path标识 1、数据库设计 --创建分类表 create table `b_category`( `id` int primary key not null auto_increment...`cat_description` text default '', `level` int not null default 0 comment '等级', `pid` int comment '父级id...', `path` varchar(10) comment 'pid+,+id标识,用于无限级分类' ); 2、PHP 代码实现 $data = $m->field("*, concat(path,'...select-box"> 顶级分类
Step 1、数据表中主要字段是id、parent_id Step 2、SQL语句: SELECT * FROM `t_class` WHERE ( is_delete=0 ) ORDER BY parent_id...ASC,id ASC //这里的排序是至关重要的 Step 3、查询出的结果是一个常规的二维数组,如下图: ps:pid就是parent_id,这里是举个例子,下文一样 Step 4、封装的无限级分类数组处理函数...: /** * 无限级分类 * * @access public * @param Array $data * //数据库里获取的结果集... */ // 存放无限分类结果如果一页面有多个无限分类可以使用 Tool::$treeList = array(); 清空 public static $treeList =... ├ {$dlist.class_name} Step 8、最终效果: 到这里就实现了一个无限下级的效果
这些功能都有共同的特点: 有父子关系 可无限递归 我们以导航菜单为例, 我们将导航菜单设置为动态的, 即从动态加载菜单数据。...数据库设计 适用于数据库存储的设计如下: create table `menus` ( `id` int primary key auto_increment, `name` varchar(20...) comment '菜单名称', `pid` int default 0 comment '父级 ID, 最顶级为 0', `order` int comment '排序, 序号越大, 越靠前...附:模板引擎渲染 有时我们会使用模板引擎来渲染菜单, 但由于菜单是树形结构的, 所以在模板引擎中单纯的使用 for 是无法完成无限极菜单的渲染的.
无限级分类树状结构的应用场景很多,例如后端研发需要把用户相关权限读取出来并生成树状结构,前端研发拿到权限树之后可以按照结构展示用户有权限访问的栏目;再例如网页上的栏目分级: 作者在初次接触树状结构生成需求的时候...child"] = generate_tree(source, item["id"], cache) tree.append(item) return tree 至此,无限级分类树状结构生成算法完成
无限级分类查询有很多方式。本文记录的方式是先将所有数据查出来,再使用递归对数据进行排序,并附加层级字段(level)。此方式仅仅对无限级的数据进行排序,并没有将子级内容放入父级。 1....在 TP6.0 中使用的 对无限级分类进行排序,并附加层级字段 ---- <?...CategoryModel::field('id,pid,name') ->order('sort desc') ->select(); $data = $this->_sort($data);//对无限级分类重新排序...dump($data); } /** * 无限级分类递归排序 */ private function _sort($data, $pid = 0, $level = 0) { static $arr...其他写法 ---- /** * 无限级分类排序 */ private function getTree($array, $pid = 0, $level = 0) { // 声明静态数组,避免递归调用时
互联网业务往往使用MySQL数据库作为后台存储,存储引擎使用InnoDB。我们针对互联网自身业务特点及MySQL数据库特性,讲述在具体业务场景中如何设计表和分表。...本文从介绍MySQL相关基础架构设计入手,并结合企业实际案例介绍分表和索引的设计实战技巧。 - 01、什么是InnoDB记录存储方式?...- 06、电商业务分表设计与实践 - 针对MyQL数据库特性结合自身业务特点制定了一系列数据库使用规范,可以有效的指导一线RD在项目开发过程中数据库表和索引的设计工作。...下面介绍电商业务中表和索引的重点设计原则以及两个实际案例 1、表设计原则 主键选择:前面我们已经对比分析过业务主键和自增主键的优缺点,结论是业务主键更符合业务的查询需求,而互联网业务大多都符合读多写少的特性...这对上述场景,我们在表设计上可以做哪些优化呢?常用的方案是把表垂直查分,这种很常见我们不做过多讨论。
规范总结 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留关键字【设计表后逐一排查】 所有表必须使用 Innodb 存储引擎,数据库和表的字符集统一使用...://dev.mysql.com/doc/mysqld-version-reference/en/keywords-8-0.html 建议在设计数据表之后逐一排查有没有使用关键字。...数据库基本设计规范 1....Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。 MyISAM只支持表级锁,适用插入不频繁,查询频繁的场景。 关于存储引擎 2....MyISAM存储引擎 不支持事务 只缓存索引,不缓存数据 表级锁,并发能力弱 服务器宕机,数据易损坏,且难恢复 MEMORY存储引擎 数据存放在内存中,懂得 表级锁,并发能力弱 数据类型选择 char与
表设计是每一个后端程序员都无法避开的一块转,而且这块砖一不小心就很容易烫手,本篇笔记就是喂了帮助大家在设计表是能够轻松拿捏1.命名规范数据库表名、字段名、索引名等都需要命名规范。...3.主键设计要合理主键的设计在数据库中非常重要,它用于唯一标识表中的每一行数据,并且在数据操作和查询中起到关键作用。...在mysql中,varchar和char类型表示字符长度,而其他类型表示的长度都表示字节长度。...11.避免使用MySQL保留字如果库名、表名、字段名等属性含有保留字时,SQL语句必须用反引号来引用属性名称,这将使得SQL语句书写、SHELL脚本中变量的转义等变得非常复杂。...对于MySQL来说,主要有date、datetime、time、timestamp和year。
存储大规模数据集需要仔细设计数据库模式和索引,以便能够高效地支持各种查询操作。...数据库设计表结构设计垂直分割:将大的表分割成多个相关性较小的表,以减少单个表的字段数量。这有助于提高查询效率和降低冗余。规范化:合理使用规范化,将重复数据抽取成独立的表,以减小数据冗余。...索引设计主键索引:对主键字段创建索引,以提高检索速度。...分库分表如果数据量仍然巨大,可以考虑分库分表策略,将数据划分到不同的数据库或表中。4. 数据分区根据时间、范围等条件对数据进行分区,以提高查询效率。5....在设计时,充分了解数据的访问模式,根据查询的特点合理设计索引,通过适当的规范化和分区来优化存储结构,最终达到高效的查询和存储效果。我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
二.设计表格 公司表 公司名称 公司编号(自增主键) 电话号码 A 1001 xx B 1002 xx 广告表 广告编号 有该广告的公司的编号(自增主键) 广告收费/点击一次 1 1001 2 2 1001...3 3 1002 2 点击表 广告编号 该广告发送给浏览者的日期 1 101101 2 101102 1 101323 3 111232 三.查询 查都有哪些公司 直接查询公司表的 公司名称 字段...select 公司名称 from 公司表; 结果为A,B公司投放了广告 查A公司都放了哪些广告 先到公司表,将公司名称=A的编号提取出来,然后将公司编号作为条件去广告表里找广告编号。...between 100000 and 199999; 最后做个计算即可 四.分析 表结构设置 目前有3张表,基本满足业务需求,但未来查询更多,需要重新设计主键位置,表结构。...当数据庞大,首当其冲的是点击表,可能一天有几万次记录写入,这张表将变得庞大,可以考虑将表根据月份进行拆分。
其实相对上述两种方式,还有一种方法可以从业务上面处理,就是在设计表结构的时候,根据现有业务和未来规划的业务,提前预留足够多的字段,后面表数据量大了,也不需要进行修改。...简单的来说,就是新建一张表,然后将你需要修改的表结构先添加上去,因为是空表,所以可以瞬间完成修改。后面再通过数据同步工具,将原表的数据导入到新表中。...当数据导入差不多的时候,将原表修改为原表_copy,新表修改为原表的名称,这一步也叫做表切换。...4.3 切换表数据丢失问题 切换表名这一步,数据库层面做不了限制,首先MYSQL不支持在锁住表的情况下,再去修改表名。...其实很简单,一方面大部分公司的数据量达不到亿级,另一方面也没办法保证copy替换原表数据的完整性,所以宁愿选择用户访问量少的,也不愿意用其它的方式。
表级锁 MySQL表级锁分为读锁和写锁。...表级锁在MyISAM和innoDB中都有用到,创建锁的开销小,不会出现死锁,由于锁定的是整张表,所以并发度低。...当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,推荐使用表级锁。 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,能大大减少数据库操作的冲突,由于其粒度小,加锁的开销最大。...共享锁(S LOCK) 用法:SELECT ...LOCK IN SHARE MODE; Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁...行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁。行级锁的缺点是:由于需要请求大量的锁资源,所以速度慢,内存消耗大。 (责任编辑:IT)
无限分类是一个老生常谈的话题了,网上有很多解决方案,可以分成二个流派,一种利用递归,一种利用非递归(当然需要其它一些辅助手段判断节点层次),但核心表结构都差不多,有三个关键字段(ID主键,ParentId...上级类id,ClassName类名--理论上讲,如果用递归,这三个字段就足够了),完整表结构如下 Create TABLE [dbo].
MySQL 大表数据添加新字段 有时候我们在测试环境给一个表添加字段,但是在线上环境添加一个字段,却极其的慢。...原因是线上的数据库一般会存有大量的数据(百万级,千万级),基本的添加字段方式在线上数据库已经不太合适了。...,导致新表数据流失不完整 总结 生产环境MySQL添加或修改字段主要通过如下四种方式进行,实际使用中还有很多注意事项 直接添加 如果该表读写不频繁,数据量较小(通常1G以内或百万以内),直接添加即可(可以了解一下...online ddl的知识) 使用pt_osc添加 如果表较大 但是读写不是太大,且想尽量不影响原表的读写,可以用percona tools进行添加,相当于新建一张添加了字段的新表,再将原表的数据复制到新表中...,切换后再将其他几个节点上添加字段 将现有MySQL版本5.7升级到8.0.12之后的版本 相关文章 Mysql事务 Mysql中的索引 Mysql通过binlog恢复数据
20个,表的字段过多,表中保存的数据可能会很大,查询的效率会降低。...大表拆成小表,让他们的主键相同即可。...尽可能使用 not null定义字段将字段设置成空字符串或者常量值not null防止出现空指针的问题null值存储也需要额外的空间,导致比较运算更为复杂,是优化器难以优化sqlnull值可能会导致索引失效设计索引有查询条件的字段...,一般要加索引单表的索引不超过5个区分度不高的字段,不添加索引(性别)避免索引失效的情况(mysql的内置函数)索引过多,选用联合索引优化不使用外键关联使用外键存在性能问题、并发死锁问题、使用起来不方便等...mysql对于存储过程、触发器等还不是很成熟,没有完善的出错记录处理,不建议使用sql编写的优化经验查询尽量不要使用select *查询的结果只要一条或者只要最大/小的一条记录,建议使用limit 1避免
反过来呢,一个下级分类能够属于几个上级分类呢?这个并不确定,得看具体的业务需求。如果是多个实现上会更加复杂,为了讨论层级设计,这里先限定每个分类仅有一个上级分类。...,这是当分类结构不合理时,允许修改时使用; 查询某一级的所有分类(很少会用到)。...20190523135518.png 表中 pid 即直属上级分类的 id,顶级分类设为 0.这种方案简单易懂,仅用一个字典,没有冗余信息,存储空间占用极小,在数据库层面是一个很好的设计。...而对于查询某一级的所有分类,这个设计简直是灾难。 其实这个方案也是一开始就能想到的,在层级不深的情况下,这个方案不失为一个好的选择。...所以这个分类在许多系统中使用。 方案三:基于ClosureTable的无限级分类存储 另建一张表存储节点之间的关系,其中包含了任何两个有关系的节点的关联信息: ?