0.下载:本程序可自由修改、自由分发,可在下载处获得。 1.寻呼需求信息的操作和检索是当前互联网和企业信息系统的主要职责。 信息检索是从大量数据中找出符合条件的数据,并通过用户界面呈现给用户。 符合条件的数据通常有几万条,用户一次接受的信息量很小。 因此,如果一次性将所有符合用户条件的数据展示给用户,在大多数场景下,大部分数据都会是冗余的。 信息检索完成后,需要经过传输(从存储介质到应用程序)和相关计算(业务逻辑)。 因此,我们需要一种分段的信息检索机制来减少这种冗余。 分页应运而生。 2、分页的开发是一个基本的分页程序。 数据按照每页记录数分为ceil(/)页()。 第一段数据是第一次向用户显示。 在后续的交互过程中,用户可以选择进入某个页面。 查看一页上的数据。 后来主要是微博应用出现后,由于其信息变化很快,其特点是根据时间线添加数据,基本的分页程序已经不能满足需求了: a) 获取下一页时,数据集可能发生多次变更,翻页随时可能导致数据重复或跳转; b) 此类应用使用的用户界面较多,一屏显示多条数据,进一步加剧了数据重复/跳转对用户体验的影响。
因此,程序员开始采用记录下一个获取数据的点的方法,从而缓解了上述缺点。 在同一个用户界面中,通过用户的阅读行为自动获取下/上一段数据确实比点击“下一页”按钮的用户体验要好,但也有缺点:第100页,他要返回到我们刚才感兴趣的第5页的信息,这并不是一件容易的事情。这实际上是设计应用程序的一个规则。 我们不能允许用户界面在单个页面上有太多屏幕,这会降低用户体验; b) 仅仅从数据的角度来看,我们多次读取之间的时间足以让数据发生变化。 当一次只显示一屏时,我们很难发现这些问题(因此不影响用户体验)。 但是,当一个页面显示100个屏幕的数据存储时,这种变化就会被放大,此时,数据重复/跳转的问题就会再次出现; c) 从程序的角度来看,将大量数据放置在同一个用户界面中必然会导致用户界面的程序逻辑受到损害。 做作的。 基于以上考虑,目前应用已经开始对分页进行修改,限制一个页面显示的屏幕数量,增加页码的概念。 此外,它还结合了实现最佳用户体验和保证数据逻辑的方法。 正确性(减少错误)。 3.关于分页的讨论,感谢xp/jp/zq/lw的四位同事的讨论。 在多次讨论的基础上,我们分析了分页程序的本质。
主要结论如下: 1)分页的目的是分段读取数据 2)能够分页的数据必须是有序的,即使依赖于数据库存储顺序。 (换个方式更容易理解:当数据集不发生变化时,多次执行同一个输入,输出顺序保持不变) 3)所有分段数据读取必须完全保证数据集的一致性保证数据集顺序的一致性,即快照 4)传统分页、分段分页(每个页分为多个段)最终是对数据集的一次切割,映射到MySQL的SQL语法。 ,即根据输入得到limit子句。 适用的场景是数据集变化频率较低的情况 5)分页类型。 它的本质是假设现有数据没有发生变化,将数据集中某一点的id(可以在数据集中绝对定位的数据的相关字段)提供给用户端,并且每次携带id去读取对应位置的数据,从而模拟快照。 使用场景是数据集中历史数据变化的频率较低,并且频繁添加新数据。 6)如果有快照系统,能够在每次发起会话时为数据集生成快照数据,那么一切问题就迎刃而解了 7)当没有快照系统时,我们可以使用限制数据的方法范围并模拟快照系统,这可以解决大多数问题 8)要使用模拟快照,其数据集排序规则必须有一个字段(可能是复合的)唯一标识其每个数据。 4.
实现思路 1) 提供SQL转换功能 2) 支持分段分页(page, , ping, )、传统分页(page, )、原始分页(-count)、分页(, ) 3) 分段分页、传统分页、原始分页在底层转换为原始分页处理5。 实现定义输入:page #请求页号,范围:[1,],超出范围计算为边界,即0修正为1,+1修正为ping #请求段号,范围:[1 ,],超出范围计算为边界,即0修正为1,+1修正为#每页段数,范围:[1,无限] count #要获取的记录条数,当前应用场景的含义是:每段记录数,范围:[1,无穷大] ] #总记录数,范围:[1,无穷大] : # count #读取记录数 Input: # (必须按照count对齐,即可以除以count), range: [0, ] #每页的段数,范围: [1,] count #读取次数,范围: [1, [] : page #请求页数 ping #请求段数 #每页的段数 count #获取记录数,当前应用场景的含义是:每个段的记录数 输入:page #页码,范围:[1, ],超出范围按边界计算,即0修正为1,+1修正为#总记录数,范围:[1,无限] count #条数需要获取的记录数,当前应用场景的含义是:每页记录数,范围:[1,无限] : # count #读取记录数 Input: # (必须根据count对齐,即能被count整除),range: [0, ] count #读取的记录条数,range: [1, ] : page #请求页数 count #要获取的记录条数,当前申请的场景含义为: 每页条数 #解析符合mysql语法规范的SQL语句,获取各个组件 input: sql #需要解析的SQL语句 输出: #SQL解析的字段 #将SQL语句组件集转换成SQL语句 input: #待恢复的SQL语句组件集输出:sql #恢复后的SQL语句 #将符合mysql语法规范的语句转换为获取计数 input: #待转换为查询计数别名的SQL语句组件集 # count字段的别名输出:#转换后的查询count SQL语句组件集输入:#SQL语句组件集增加偏移量,不允许LIMIT组件#偏移量(必须按照count对齐,即可以整除by count), range: [0,] count #要获取的记录条数,范围:[1,] : #已添加LIMIT组件的SQL语句组件集 #增加范围 input: #SQL语句组件集to增加范围限制 #标记上次请求的数据的左边界 #标记上次请求获取的数据的右边界 : #添加模拟快照范围限制后设置的SQL语句组件 #获取当前数据集的边界输入: #要读取的数据集对应的SQL 语句组件集数据 #结果数据集输出: #当前数据集左边界 #当前数据集右边界 #分页执行支持的SQL语句输入:sql #要执行的业务SQL语句 #(必须按照count对齐,即能被count整除),range: [0, ] count #读取的条数,range: [1, ] #标记左边上一次请求获取的数据的边界 #标记上一次请求获取的数据的右边界 : datas #查询结果集 #偏移计数 #读取的条数 #当前数据集的左边界 #当前数据集的右边界当前数据集 6.
实现的执行流程是分段分页应用(page, ping, , count): = (sql); (, 计数)= (页, ping, , 计数, ) (数据, , 计数)= (sql, , 计数, NULL, NULL); (页面、ping、、、、计数)=(、、、计数、); (数据、页面、ping、、、计数); 传统分页应用(page、count):=(sql); (, 计数)= (页, 计数, ) (数据, , 计数)= (sql, , 计数, NULL, NULL); (页, , 计数)= (, 计数, ); (数据、页数、计数); 分页应用(count, , ): = (sql); (数据, , 计数, , ) = (sql, NULL, 计数, , ); (数数, , ); 复合分段分页应用(page, ping, , count, , ): = (sql); (, 计数)= (页, ping, , 计数, ) (数据, , 计数, , ) = (sql, , 计数, , ); (页面、ping、、、计数) = (、、计数、); (数据、页面、ping、、、计数、、); 复合传统分页应用(page, count, , ): = (sql); (, 计数)= (页, 计数, ) (数据, , 计数, , ) = (sql, , 计数, , ); (页, , 计数)= (, 计数, ); (数据、页、、计数、、); (sql, , 计数, , ) = (); = () || (); = (sql); 如果 ( ) : = (, , 计数); endif if ( ) : = (, , ); endif sql=(); 数据=(sql); (, ) = (, 数据); ret=(数据); if ( ) : (ret, , 计数); endif if ( ) : (ret, , ); endif(ret);7。
测试点 1)传统寻呼 2)分段寻呼 3)原始寻呼 4)寻呼 5)复合传统寻呼 6)复合分段寻呼 7)复合原始寻呼 8.测试数据构造 DROP IF ``; IF NOT ``;使用 ``;DROP TABLE IF `feed`; TABLE IF NOT `feed` (`` INT NOT NULL KEY '微博 ID', `ctime` INT NOT NULL '微博创建时间', `` CHAR(20) NOT NULL '' '微博内容', `` INT NOT NULL 0 '微博转发号') '微博表';DROP TABLE IF ``; TABLE IF NOT `` ( `` INT NOT NULL KEY '评论ID', `` CHAR(20) NOT NULL '' '评论内容', `` INT NOT NUL '评论微博ID') '评论表';DROP TABLE如果“热”; TABLE IF NOT `hot` (`` INT NOT NULL KEY '微博ID', `hot` INT NOT NULL 0 '微博热度') '热门微博表';9.
测试用例: 1) 搜索最热门的微博 ( f., f., h. hot FROM feed AS f JOIN hot AS h ON f. = h. ORDER BY hhot DESC, f. DESC) 2) 搜索热门评论微博 ( f., f., COUNT(c.*) AS count FROM feed AS f JOIN AS c ON f. = c. GROUP BY c. ORDER BY count DESC, f. DESC) 3) 搜索热门微博 (, , FROM feed ORDER BY DESC, DESC) 4) 以上三种场景均测试了7个测试点10。 文件列表。 txt 您当前正在阅读的开发文档页面。 库。 php分页库。 PHP单元测试基本功能。 PHP不同页面之间的转换单元测试。 PHP SQL语句解析测试。 php分页测试