当前位置:首页 » 编程语言 » php数据字典

php数据字典

发布时间: 2023-05-31 04:24:48

㈠ is_attached在php中表示什么

这是个字段名友搏吧 通常情况下数据表中设败握置这个字段 表示是否包含附件 可以参察告庆照Discuz的数据字典看一下

㈡ PHP与Mysql权威指南的目录

推荐序
作者简介
前言
第一部分 准 备 篇
第1章 apache基础
1.1 apache介绍
1.1.1 apache工作原理
1.1.2 apache的特点
1.2 windows下apache的部署
1.2.1 windows下apache的安装和配置
1.2.2 启动、停止和重新启动apache服务
1.2.3 apache支持php语言
1.3 httpd.conf深入剖析
1.3.1 站点的基本配置
1.3.2 服务器优化配置
1.3.3 http响应头的信息配置
1.3.4 持久性连接配置
1.4 日志记录
1.4.1 日志的配置
1.4.2 错误日志
1.4.3 访问日志
1.5 虚拟主机
1.5.1 基于主机名的虚拟主机
1.5.2 基于ip地址的虚拟主机
1.6 url重写
1.6.1 mod_rewrite模块
1.6.2 常用指令
1.7 实战案例
1.7.1 防止图片盗链
1.7.2 apache伪静态
1.7.3 用户访问权限设置
1.8 小结
第2章 php与mysql开发环境的搭建
2.1 在windows上安装iis
2.2 php的安装和配置
2.2.1 在windows下的安装和配置
2.2.2 在linux下的安装和配置
2.3 mysql的安装和配置
2.3.1 windows下的安装友罩蠢和配置
2.3.2 linux下的安装和配置
2.4 php与mysql连接
2.5 小结
第二部分 php篇
第3章 php基础
3.1 php的工作原理
3.2 php的版本变迁
3.3 php的特性
3.4 php的应用范围
3.5 php的基本语法
3.5.1 php 标记
3.5.2 php 中的注释
3.5.3 编写你的第一个php应用
3.6 php中的变量与常量
3.6.1 变量
3.6.2 常量
3.7 表达式
3.7.1 表达式分类
3.7.2 表达式的应用
3.7.3 操作数
3.7.4 操作符
3.8 php中的数据类型
3.8.1 布尔型
3.8.2 整型
3.8.3 字符串
3.8.4 数组
3.8.5 对象
3.8.6 其他类型
3.9 强制类型转换
3.9.1 显式和隐式强制类型转换
3.9.2 有用的强制类型转换函数
3.10 php的语句
3.10.1 循环语句
3.10.2 条件判断语句
3.11 小结
第4章 字符串和正则表达式
4.1 什么是字符串
4.2 定义一个字符串
4.2.1 使用单引号
4.2.2 使用双引号
4.2.3 使用定界符
4.3 获取字符串
4.4 拼接字符串
4.5 字符串的格式化
4.6 修改字母大小写
4.7 计算字符串长度和字符数目
4.8 字符串查找函数
4.8.1 字符串的查找
4.8.2 取得字符串的位置
4.9 字符串的复制和替换
4.9.1 字符串的复制
4.9.2 字符串的替换
4.10 字符串的比较
4.11 正则表达式的概念和语法
4.11.1 基本模式匹配
4.11.2 字符集
4.11.3 重复
4.12 使用正则表达式查找子字符串
4.13 使用正则表达式分割字符串
4.14 小结
第5章 数组
5.1 数组的基本概念
5.1.1 什么是数组
5.1.2 数组操作符
5.2 数字索引数组
5.2.1 数字索引数组的初始化
5.2.2 访问数组的内容
5.2.3 使用循环访问数组
5.3 数组的创建和添加
5.3.1 创建数组
5.3.2 添加数组
5.4 数组元素的添加和删除
5.4.1 在数组头添加元素
5.4.2 在数组尾添加元素
5.4.3 从数组头删除元素
5.4.4 从数组尾删除元素
5.5 数组的遍历
5.6 字符串与数组之间的转换
5.7 多维数组
5.8 数组的排序
5.8.1 sort()和rsort()
5.8.2 asort()和arsort()
5.8.3 ksort()和krsort()
5.8.4 随机排序函数shuffle()
5.8.5 多维数组的排序
5.9 数组判断函数
5.10 数组的合并与拆分
5.10.1 合并函数array_merge()
5.10.2 合并函数array_combine()
5.10.3 拆分函数 array_chunk()
5.10.4 返回数组交集的函数array_intersect()
5.10.5 将数组转换成标量变量
5.11 快速初始化好陪数组
5.11.1 range()函数
5.11.2 array_fill()函数
5.12 在数组中查找值
5.13 定位数组元素
5.13.1 搜索数组闷汪
5.13.2 获取数组键
5.13.3 获取数组值
5.14 小结
第6章 php对文件的操作
6.1 打开/关闭文件
6.1.1 打开文件
6.1.2 关闭文件
6.2 读取文件
6.2.1 fread()和file()函数
6.2.2 fpassthru()函数
6.2.3 fgets()和fgetss()函数
6.2.4 fgetcsv()函数
6.3 写入文件
6.4 方便的文件处理函数
6.5 其他文件处理函数
6.6 移动文件指针小案例
6.7 文件锁定
6.8 小结
第7章 php函数与代码的重用性
7.1 定义和调用函数
7.2 参数
7.2.1 按值传递
7.2.2 按引用传递
7.2.3 默认参数值
7.3 函数内的变量范围
7.3.1 局部变量
7.3.2 静态变量
7.3.3 全局变量
7.4 函数的作用域和可用性
7.5 用变量存储函数的名称
7.6 递归函数
7.7 使用和包含文件
7.7.1 include与require 的应用
7.7.2 php模板化
7.8 小结
第8章 面向对象的程序设计
8.1 类和对象的关键概念
8.1.1 类
8.1.2 对象
8.1.3 字段
8.1.4 属性
8.1.5 常量
8.1.6 方法
8.1.7 $this关键字
8.2 构造方法和析构方法
8.2.1 构造方法
8.2.2 析构方法
8.3 静态类成员
8.3.1 静态属性
8.3.2 静态方法
8.4 对象克隆
8.4.1 clone一个对象
8.4.2 _clone()方法
8.5 继承
8.5.1 如何继承一个类
8.5.2 使用parent::关键字
8.5.3 instanceof关键字
8.5.4 覆盖父类的方法
8.6 多态
8.7 抽象类和接口
8.7.1 抽象类
8.7.2 接口
8.7.3 抽象类与接口的区别
8.8 命名空间
8.9 php5中的特殊方法
8.9.1 __tostring()
8.9.2 __autoload()
8.9.3 __get()方法和__set()方法
8.9.4 __call
8.10 小结
第9章 php的错误、异常处理和调试
9.1 常见的错误类型
9.1.1 语法错误
9.1.2 逻辑错误
9.1.3 未定义错误
9.1.4 环境错误
9.1.5 运行错误
9.2 错误处理机制
9.2.1 错误级别列表
9.2.2 错误处理函数
9.2.3 自定义错误页面
9.2.4 错误日志
9.3 异常处理
9.3.1 异常的基本使用
9.3.2 php的基本异常类
9.3.3 try、throw和catch
9.3.4 创建自定义的exception类
9.3.5 多个异常
9.3.6 重新抛出异常
9.3.7 设置顶层异常处理器(top level exception handler)
9.3.8 异常的规则
9.4 使用xdebug进行调试
9.4.1 xdebug的安装
9.4.2 xdebug的使用
9.4.3 xdebug的特制函数
9.5 小结
第10章 php与html的交互
10.1 php和web表单
10.1.1 表单基本操作
10.1.2 表单安全性
10.1.3 常用表单数据的验证方法
10.2 通过php上传文件
10.2.1 php文件上传/资源指令
10.2.2 上传错误消息
10.2.3 php文件上传示例
10.3 小结
第三部分 mysql篇
第11章 mysql部署与基本使用
11.1 mysql概述
11.1.1 mysql为何如此流行
11.1.2 mysql特性
11.2 登录与退出mysql
11.3 创建、删除数据库和用户
11.4 mysql用户管理及权限分配
11.4.1 mysql访问权限系统
11.4.2 设置用户权限
11.4.3 grant和revoke命令
11.5 mysql优化
11.6 小结
第12章 数据库操作:php+mysql
12.1 mysql扩展
12.1.1 数据库连接
12.1.2 向数据库中插入数据
12.2 mysqli扩展
12.2.1 mysqli的面向对象和面向过程编程方式
12.2.2 预准备语句
12.2.3 多查询
12.3 数据库抽象层
12.3.1 pdo
12.3.2 adodb
12.4 小结
第13章 mysql中sql语句的应用
13.1 sql语句的基本应用
13.2 常数列的最大值
13.3 拥有某列最大值的行
13.4 按组排列的最大值
13.5 提取某列在组间的最大值
13.6 使用用户变量
13.7 使用auto_increment
13.8 常用的字符串函数
13.9 常用的日期和时间函数
13.10 导入数据
13.10.1 load data infile
13.10.2 mysqlimport
13.11 导出数据
13.11.1 select into outfile
13.11.2 mysqlmp
13.12 小结
第14章 mysql数据库开发
14.1 mysql的数据列类型
14.1.1 数值类型列
14.1.2 字符串类型列
14.2 字符集支持
14.3 索引的使用
14.3.1 数据库索引
14.3.2 主要索引介绍
14.3.3 索引最佳实践
14.4 事务处理
14.4.1 非事务实现方法
14.4.2 事务实现方法
14.5 外键与数据的完整性
14.6 数据库内部语句和语法
14.6.1 alter database语法
14.6.2 alter table语法
14.6.3 create database语法
14.6.4 create index语法
14.6.5 create table语法
14.6.6 drop database语法
14.6.7 drop index语法
14.6.8 drop table语法
14.6.9 rename table语法
14.7 数据库操作语句和语法
14.7.1 delete语法
14.7.2 do语法
14.7.3 handler语法
14.7.4 insert语法
14.7.5 load data infile语法
14.7.6 fields分隔符
14.7.7 replace语法
14.7.8 select语法
14.7.9 truncate语法
14.7.10 update语法
14.7.11 explain语法
14.8 存储过程
14.9 小结
第15章 mysql数据管理
15.1 mysql的分区
15.1.1 range分区
15.1.2 list分区
15.1.3 range和list分区的管理
15.2 mysql的备份
15.3 mysql的恢复
15.4 mysql复制
15.5 小结
第16章 mysql的存储引擎及表类型
16.1 myisam存储引擎
16.1.1 myisam启动选项
16.1.2 损坏的myisam表
16.1.3 未被适当关闭的表的问题
16.2 innodb存储引擎
16.2.1 innodb配置
16.2.2 innodb启动选项
16.2.3 创建innodb表空间
16.2.4 处理innodb初始化问题
16.2.5 备份和恢复innodb数据库
16.2.6 添加和删除innodb数据和日志文件
16.3 merge存储引擎
16.4 memory(heap)存储引擎
16.5 bdb(berkeleydb)存储引擎
16.5.1 bdb支持的操作系统
16.5.2 bdb启动选项
16.6 example存储引擎
16.7 federated存储引擎
16.7.1 federated存储引擎的描述
16.7.2 如何使用federated表
16.7.3 federated存储引擎的局限性
16.8 archive存储引擎
16.9 csv存储引擎
16.10 blackhole存储引擎
16.11 mysql最新版本的功能
16.12 小结
第17章 phpmyadmin
17.1 phpmyadmin的安装与配置
17.1.1 phpmyadmin的安装
17.1.2 phpmyadmin的配置
17.1.3 phpmyadmin配置完成后可能遇到的问题
17.2 phpmyadmin的使用
17.2.1 phpmyadmin的登录
17.2.2 phpmyadmin基本功能介绍
17.2.3 数据库管理
17.2.4 数据表管理
17.2.5 数据记录管理
17.3 小结
第四部分 二次开发实战篇
第18章 smarty应用
18.1 什么是模板引擎
18.2 smarty模板引擎
18.3 smarty的安装及初始化配置
18.3.1 安装smarty
18.3.2 初始化smarty类库的默认设置
18.3.3 程序注释
18.3.4 简单示例
18.4 smarty的使用步骤
18.5 变量使用
18.5.1 模板中输出php分配的变量
18.5.2 使用保留变量
18.6 变量调解器
18.7 模板的控制结构
18.7.1 条件选择结构:if-elseif-else
18.7.2 foreach
18.7.3 section
18.8 smarty缓存
18.8.1 在smarty中控制缓存
18.8.2 每个页面使用多个缓存
18.8.3 为缓存实例消除处理开销
18.8.4 清除缓存
18.8.5 关闭局部缓存
18.9 小结
第19章 zend 系列开发工具
19.1 zend core集成环境
19.1.1 zend core介绍
19.1.2 zend core的安装
19.2 zend optimizer优化器
19.2.1 zend optimizer介绍
19.2.2 zend optimizer的安装
19.2.3 zend optimizer的优化及配置
19.3 zend studio 开发工具
19.3.1 zend studio介绍
19.3.2 zend studio的下载与安装
19.3.3 zend studio功能及组件
19.3.4 zend studio的用户界面
19.3.5 zend studio项目管理
19.4 zend server服务器
19.4.1 zend server简介
19.4.2 zend server安装
19.5 zend guard安全卫士
19.5.1 zend guard简介
19.5.2 zend guard安装
19.5.3 使用zend guard加密文件
19.6 zend platform应用平台
19.6.1 zend platform 概述
19.6.2 zend platform的安装
19.7 小结
第20章 svn版本控制及团队管理
20.1 基本概念
20.1.1 什么是版本控制
20.1.2 什么是 subversion
20.1.3 什么是版本库
20.2 svn服务器的安装与配置
20.2.1 基于svnserve的svn配置
20.2.2 基于apache的svn服务器
20.3 客户端工具tortoisesvn
20.3.1 什么是tortoisesvn
20.3.2 下载与安装tortoisesvn
20.3.3 tortoisesvn使用
20.4 小结
第21章 ucenter开发实战
21.1 ucenter总述
21.1.1 ucenter简介
21.1.2 ucenter安装
21.1.3 使用ucenter
21.2 ucenter源代码分析
21.2.1 ucenter系统架构
21.2.2 ucenter的目录结构
21.2.3 ucenter核心代码:/index.php
21.2.4 ucenter核心代码:/admin.php
21.3 ucenter接口原理
21.3.1 接口函数定义的程序文件/uc_client/client.php
21.3.2 通知接口文件uc.php
21.4 ucenter接口开发实例—读取论坛主题或帖子数量信息
21.5 小结
第22章 discuz! 论坛开发实战
22.1 discuz!总述
22.1.1 discuz!简介
22.1.2 discuz!特性
22.1.3 discuz!安装
22.1.4 使用discuz!
22.2 discuz!的源代码分析
22.2.1 discuz!系统架构
22.2.2 discuz!数据库结构
22.2.3 discuz!的目录及文件结构
22.2.4 discuz!核心代码:/include/common.inc.php
22.2.5 discuz!核心代码:/include/global.func.php
22.2.6 discuz!核心代码:/include/db_mysql.class.php
22.2.7 discuz!核心代码:/include/template.func.php
22.2.8 discuz!核心代码:/include/cache.func.php
22.2.9 discuz!核心代码:/admincp.php
22.3 discuz!的二次开发实例—多语言切换(一)
22.3.1 改造目录结构
22.3.2 修改数据库
22.3.3 修改language()函数
22.3.4 修改template()函数
22.3.5 修改parse_template()函数
22.4 discuz!的二次开发实例—多语言切换(二)
22.4.1 插件模块概述
22.4.2 多语言切换后台管理
22.4.3 获取用户选择或系统设定的语言包信息
22.4.4 制作语言包切换菜单
22.4.5 编写插件语言包
22.5 小结
第23章 ucenter home sns系统开发实战
23.1 ucenter home总述
23.1.1 ucenter home简介
23.1.2 ucenter home的安装
23.1.3 ucenter home的使用
23.2 ucenter home源代码分析
23.2.1 ucenter home目录及文件结构
23.2.2 核心代码:/source/common.php
23.2.3 核心代码:/source/function_common.php
23.2.4 核心代码:/source/class_mysql.php
23.2.5 核心代码: /do.php
23.3 ucenter home的内部机制
23.3.1 ucenter home模板机制
23.3.2 ucenter home缓存机制
23.3.3 ucenter home登录验证机制
23.3.4 ucenter home道具机制
23.3.5 ucenter home任务的计划机制
23.3.6 ucenter home动态机制
23.3.7 ucenter home评论机制
23.3.8 ucenter home权限机制
23.4 ucenter home的二次开发实例—《记账本》插件
23.4.1 《记账本》代码设计
23.4.2 《记账本》插件的安装说明
23.5 小结
第24章 shopnc多用户商城开发实战
24.1 shopnc总述
24.1.1 shopnc综合多用户商城系统简介
24.1.2 shopnc的安装
24.2 shopnc多用户商城的源代码分析
24.2.1 shopnc多用户商城的系统特性
24.2.2 shopnc系统结构
24.2.3 shopnc模板引擎
24.2.4 核心模块的简要说明
24.2.5 核心模块的详细描述
24.2.6 核心模块的使用说明
24.3 shopnc插件的开发
24.4 shopnc支付接口
24.5 shopnc商品页静态化
24.6 shopnc商品图片上传
24.7 小结
第25章 phpcms v9内容管理系统开发实战
25.1 phpcms v9总述
25.1.1 phpcms简介
25.1.2 phpcms v9的新特性
25.1.3 phpcms v9的安装
25.2 phpcms源码分析
25.2.1 目录及文件结构
25.2.2 模板语法规则
25.3 phpcms v9二次开发介绍
25.3.1 开发接口概述
25.3.2 系统类库与函数库的调用
25.3.3 理解模块和控制器
25.3.4 二次开发的命名规范
25.3.5 二次开发的流程
25.3.6 二次开发技巧
25.4 pc标签的使用说明
25.4.1 pc标签概述
25.4.2 pc标签的语法
25.4.3 pc标签的保留参数
25.4.4 pc标签数据的显示
25.4.5 pc标签的分类
25.4.6 pc标签工具箱
25.5 phpcms和ucenter的整合
25.5.1 phpsso简介
25.5.2 phpsso与ucenter的整合
25.5.3 phpsso与ucenter整合的常见问题
25.6 phpcms二次开发实例—留言本
25.6.1 需求分析
25.6.2 数据库和数据表的设计
25.6.3 创建模块目录
25.6.4 创建数据模型类文件
25.6.5 开发模块控制器和函数
25.7 小结
附录a comsenz产品开发—ucenter 1.5 数据字典
附录b discuz! 7.0.0 数据字典
附录c uc home 2.0数据字典
附录d shopnc 2.0数据字典
附录e phpcms v9数据字典
后记

㈢ 菜鸟求助PHP字符替换的问题

当然得用正则表达式来替换啦

preg_replace("/\[hidden=(.+?)\](.+?)\[\/hidden\]/",'<input type=RADIO onclick="A1.style.display=A1.style.display=='none'?'':'none'" Value=" ON">\\1</input><div id="A1" style="display:none">\\2</div> ',$Text);

正则表达式太强大了,功能太多了,我自己还没完全弄清,学习了正则表达式,你编辑的字符串编程能力会大大提高的,建议你去看一些教程,网上很多的

㈣ 学习php的二次开发需要了解哪些知识,如何才能够尽快的学会呢,要求是用destoon进行二次开发

1,html+css知识,用来改模板。

2,Javascript知识,有一些页面事件,特效

3,php+mysql知识,用于修改程序逻辑和数据处理

4,操作系统知识:网站架构与调优


多去官网,参考手册,二次开发入门、常量与变量、数据字典


㈤ PHP查询结果如何对变量值进行排序比如说一个评分系统,对每个人员的每项评分相加后的总分再进行排序!

数据库设计方法、规范与技巧
一、数据库设计过程
数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求。
数据库设计中需求分析阶段综合各个用户的应用需求(现实世界的需求),在概念设计阶段形成独立于机器特点、独立于各个DBMS产品的概念模式(信息世界模型),用E-R图来描述。在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系模型,形成数据库逻辑模式。然后根据用户处理的要求,安全性的考虑,在基本表的基础上再建立必要的视图(VIEW)形成数据的外模式。在物理设计阶段根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。
1. 需求分析阶段
需求收集和分析,结果得到数据字典描述的数据需求(和数据流图描述的处理需求)。
需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。
需求分析的方法:调查组织机构情况、调查各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。
常用的调查方法有: 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。
分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法(Structured Analysis,简称SA方法)从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并把每一层用数据流图和数据字典描述。
数据流图表达了数据和处理过程的关系。系统中的数据则借助数据字典(Data Dictionary,简称DD)来描述。
数据字典是各类数据描述的集合,它是关于数据库中数据的描述,即元数据,而不是数据本身。数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分(至少应该包含每个字段的数据类型和在每个表内的主外键)。
数据项描述={数据项名,数据项含义说明,别名,数据类型,长度,
取值范围,取值含义,与其他数据项的逻辑关系}
数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}
数据流描述={数据流名,说明,数据流来源,数据流去向,
组成:{数据结构},平均流量,高峰期流量}
数据存储描述={数据存储名,说明,编号,流入的数据流,流出的数据流,
组成:{数据结构},数据量,存取方式}
处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流},
处理:{简要说明}}
2. 概念结构设计阶段
通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型,可以用E-R图表示。
概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。概念模型可以转换为计算机上某一DBMS支持的特定数据模型。
概念模型特点:
(1) 具有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识。
(2) 应该简单、清晰、易于用户理解,是用户与数据库设计人员之间进行交流的语言。
概念模型设计的一种常用方法为IDEF1X方法,它就是把实体-联系方法应用到语义数据模型中的一种语义模型化技术,用于建立系统信息模型。
使用IDEF1X方法创建E-R模型的步骤如下所示:
2.1 第零步——初始化工程
这个阶段的任务是从目的描述和范围描述开始,确定建模目标,开发建模计划,组织建模队伍,收集源材料,制定约束和规范。收集源材料是这阶段的重点。通过调查和观察结果,业务流程,原有系统的输入输出,各种报表,收集原始数据,形成了基本数据资料表。
2.2 第一步——定义实体
实体集成员都有一个共同的特征和属性集,可以从收集的源材料——基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及具有“代码”结尾的术语,如客户代码、代理商代码、产品代码等将其名词部分代表的实体标识出来,从而初步找出潜在的实体,形成初步实体表。

2.3 第二步——定义联系
IDEF1X模型中只允许二元联系,n元联系必须定义为n个二元联系。根据实际的业务需求和规则,使用实体联系矩阵来标识实体间的二元关系,然后根据实际情况确定出连接关系的势、关系名和说明,确定关系类型,是标识关系、非标识关系(强制的或可选的)还是非确定关系、分类关系。如果子实体的每个实例都需要通过和父实体的关系来标识,则为标识关系,否则为非标识关系。非标识关系中,如果每个子实体的实例都与而且只与一个父实体关联,则为强制的,否则为非强制的。如果父实体与子实体代表的是同一现实对象,那么它们为分类关系。
2.4 第三步——定义码
通过引入交叉实体除去上一阶段产生的非确定关系,然后从非交叉实体和独立实体开始标识侯选码属性,以便唯一识别每个实体的实例,再从侯选码中确定主码。为了确定主码和关系的有效性,通过非空规则和非多值规则来保证,即一个实体实例的一个属性不能是空值,也不能在同一个时刻有一个以上的值。找出误认的确定关系,将实体进一步分解,最后构造出IDEF1X模型的键基视图(KB图)。
2.5 第四步——定义属性
从源数据表中抽取说明性的名词开发出属性表,确定属性的所有者。定义非主码属性,检查属性的非空及非多值规则。此外,还要检查完全依赖函数规则和非传递依赖规则,保证一个非主码属性必须依赖于主码、整个主码、仅仅是主码。以此得到了至少符合关系理论第三范式的改进的IDEF1X模型的全属性视图。
2.6 第五步——定义其他对象和规则
定义属性的数据类型、长度、精度、非空、缺省值、约束规则等。定义触发器、存储过程、视图、角色、同义词、序列等对象信息。
3. 逻辑结构设计阶段
将概念结构转换为某个DBMS所支持的数据模型(例如关系模型),并对其进行优化。设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型,然后选择最合适的DBMS。
将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则:
1)一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。
2)一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。
3)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。
4)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
5)三个或三个以上实体间的一个多元联系转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。
6)同一实体集的实体间的联系,即自联系,也可按上述1:1、1:n和m:n三种情况分别处理。
7)具有相同码的关系模式可合并。
为了进一步提高数据库应用系统的性能,通常以规范化理论为指导,还应该适当地修改、调整数据模型的结构,这就是数据模型的优化。确定数据依赖。消除冗余的联系。确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准,即:
表内的每一个值都只能被表达一次。
表内的每一行都应该被唯一的标识(有唯一键)。
表内不应该存储依赖于其他键的非键信息。
4. 数据库物理设计阶段
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。
5. 数据库实施阶段
运用DBMS提供的数据语言(例如SQL)及其宿主语言(例如C),根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。 数据库实施主要包括以下工作:用DDL定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行 6. 数据库运行和维护阶段
数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。包括:数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。

建模工具的使用
为加快数据库设计速度,目前有很多数据库辅助工具(CASE工具),如Rational公司的Rational Rose,CA公司的Erwin和Bpwin,Sybase公司的PowerDesigner以及Oracle公司的Oracle Designer等。
ERwin主要用来建立数据库的概念模型和物理模型。它能用图形化的方式,描述出实体、联系及实体的属性。ERwin支持IDEF1X方法。通过使用ERwin建模工具自动生成、更改和分析IDEF1X模型,不仅能得到优秀的业务功能和数据需求模型,而且可以实现从IDEF1X模型到数据库物理设计的转变。ERwin工具绘制的模型对应于逻辑模型和物理模型两种。在逻辑模型中,IDEF1X工具箱可以方便地用图形化的方式构建和绘制实体联系及实体的属性。在物理模型中,ERwin可以定义对应的表、列,并可针对各种数据库管理系统自动转换为适当的类型。
设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后,设计人员可以使用Erwin画ER图,将ER图转换为关系数据模型,生成数据库结构;画数据流图,生成应用程序。
二、数据库设计技巧
1. 设计数据库之前(需求分析阶段)
1) 理解客户需求,询问用户如何看待未来需求变化。让客户解释其需求,而且随着开发的继续,还要经常询问客户保证其需求仍然在开发的目的之中。
2) 了解企业业务可以在以后的开发阶段节约大量的时间。
3) 重视输入输出。
在定义数据库表和字段需求(输入)时,首先应检查现有的或者已经设计出的报表、查询和视图(输出)以决定为了支持这些输出哪些是必要的表和字段。
举例:假如客户需要一个报表按照邮政编码排序、分段和求和,你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。
4) 创建数据字典和ER 图表
ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用,而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。
5) 定义标准的对象命名规范
数据库各种对象的命名必须规范。
2. 表和字段的设计(数据库逻辑设计)
表设计原则
1) 标准化和规范化
数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点:有一组表专门存放通过键连接起来的关联数据。
举例:某个存放客户及其有关定单的3NF 数据库就可能有两个表:Customer 和Order。Order 表不包含定单关联客户的任何信息,但表内会存放一个键值,该键指向Customer 表里包含该客户信息的那一行。
事实上,为了效率的缘故,对表不进行标准化有时也是必要的。
2) 数据驱动
采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强系统的灵活性和扩展性。
举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。
3) 考虑各种变化
在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。 举例,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。

字段设计原则
4) 每个表中都应该添加的3 个有用的字段
dRecordCreationDate,在VB 下默认是Now(),而在SQL Server 下默认为GETDATE()
sRecordCreator,在SQL Server 下默认为NOT NULL DEFAULT USER
nRecordVersion,记录的版本标记;有助于准确说明记录中出现null 数据或者丢失数据的原因
5) 对地址和电话采用多个字段
描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别。
6) 使用角色实体定义属于某类别的列
在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关联关系,从而可以实现自我文档化。
举例:用PERSON 实体和PERSON_TYPE 实体来描述人员。比方说,当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位,而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值,同时增加一个日期/时间字段来知道变化是何时发生的。这样,你的PERSON_TYPE 表就包含了所有PERSON 的可能类型,比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变PERSON 记录来反映新头衔的变化,不过这样一来在时间上无法跟踪个人所处位置的具体时间。
7) 选择数字类型和文本类型尽量充足
在SQL 中使用smallint 和tinyint 类型要特别小心。比如,假如想看看月销售总额,总额字段类型是smallint,那么,如果总额超过了$32,767 就不能进行计算操作了。
而ID 类型的文本字段,比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。
8) 增加删除标记字段
在表中包含一个“删除标记”字段,这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔细维护索引整体性。
3. 选择键和索引(数据库逻辑设计)
键选择原则:
1) 键设计4 原则
为关联字段创建外键。
所有的键都必须唯一。
避免使用复合键。
外键总是关联唯一的键字段。
2) 使用系统生成的主键
设计数据库的时候采用系统生成的键作为主键,那么实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点:当拥有一致的键结构时,找到逻辑缺陷很容易。
3) 不要用用户的键(不让主键具有可更新性)
在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。
4) 可选键有时可做主键
把可选键进一步用做主键,可以拥有建立强大索引的能力。

索引使用原则:
索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。
1) 逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列采用非成组索引。考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。
2) 大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比如运行查询显示主表和所有关联表的某条记录就用得上。
3) 不要索引memo/note 字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。
4) 不要索引常用的小型表
不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。

4. 数据完整性设计(数据库逻辑设计)
1) 完整性实现机制:
实体完整性:主键
参照完整性:
父表中删除数据:级联删除;受限删除;置空值
父表中插入数据:受限插入;递归插入
父表中更新数据:级联更新;受限更新;置空值
DBMS对参照完整性可以有两种方法实现:外键实现机制(约束规则)和触发器实现机制
用户定义完整性:
NOT NULL;CHECK;触发器
2) 用约束而非商务规则强制数据完整性
采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。
3) 强制指示完整性
在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。
4) 使用查找控制数据完整性
控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。
5) 采用视图
为了在数据库和应用程序代码之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。
5. 其他设计技巧
1) 避免使用触发器
触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。
2) 使用常用英语(或者其他任何语言)而不要使用编码
在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码,可以在编码旁附上用户知道的英语。
3) 保存常用信息
让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复(对Access)、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用。
4) 包含版本机制
在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。
5) 编制文档
对所有的快捷方式、命名规范、限制和函数都要编制文档。
采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。
对数据库文档化,或者在数据库自身的内部或者单独建立文档。这样,当过了一年多时间后再回过头来做第2 个版本,犯错的机会将大大减少。
6) 测试、测试、反复测试
建立或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。
7) 检查设计
在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据。
三、数据库命名规范
1. 实体(表)的命名
1) 表以名词或名词短语命名,确定表名是采用复数还是单数形式,此外给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前4 个字母;如果表名是两个单词,就各取两个单词的前两个字母组成4 个字母长的别名;如果表的名字由3 个单词组成,从头两个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是组成4 字母长的别名,其余依次类推)
对工作用表来说,表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中,根据语义拼凑缩写即可。注意,由于ORCLE会将字段名称统一成大写或者小写中的一种,所以要求加上下划线。
举例:
定义的缩写 Sales: Sal 销售;
Order: Ord 订单;
Detail: Dtl 明细;
则销售订单明细表命名为:Sal_Ord_Dtl;
2) 如果表或者是字段的名称仅有一个单词,那么建议不使用缩写,而是用完整的单词。
举例:
定义的缩写 Material Ma 物品;
物品表名为:Material, 而不是 Ma.
但是字段物品编码则是:Ma_ID;而不是Material_ID
3) 所有的存储值列表的表前面加上前缀Z
目的是将这些值列表类排序在数据库最后。
4) 所有的冗余类的命名(主要是累计表)前面加上前缀X
冗余类是为了提高数据库效率,非规范化数据库的时候加入的字段或者表
5) 关联类通过用下划线连接两个基本类之后,再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。
关联表用于保存多对多关系。
如果被关联的表名大于10个字母,必须将原来的表名的进行缩写。如果没有其他原因,建议都使用缩写。
举例:表Object与自身存在多对多的关系,则保存多对多关系的表命名为:R_Object;
表 Depart和Employee;存在多对多的关系;则关联表命名为R_Dept_Emp
2. 属性(列)的命名
1) 采用有意义的列名,表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码,统一命名为:ID;如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名。如果键是数字类型,你可以用_NO 作为后缀;如果是字符类型则可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。
举例:销售订单的编号字段命名:Sal_Ord_ID;如果还存在一个数据库生成的自动编号,则命名为:ID。
2) 所有的属性加上有关类型的后缀,注意,如果还需要其它的后缀,都放在类型后缀之前。
注: 数据类型是文本的字段,类型后缀TX可以不写。有些类型比较明显的字段,可以不写类型后缀。
3) 采用前缀命名
给每个表的列名都采用统一的前缀,那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列名同某些数据库联系起来。
3. 视图的命名
1) 视图以V作为前缀,其他命名规则和表的命名类似;
2) 命名应尽量体现各视图的功能。
4. 触发器的命名
触发器以TR作为前缀,触发器名为相应的表名加上后缀,Insert触发器加'_I',Delete触发器加'_D',Update触发器加'_U',如:TR_Customer_I,TR_Customer_D,TR_Customer_U。
5. 存储过程名
存储过程应以'UP_'开头,和系统的存储过程区分,后续部分主要以动宾形式构成,并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为'UP_Ins_Agent_Account'。
6. 变量名
变量名采用小写,若属于词组形式,用下划线分隔每个单词,如@my_err_no。
7. 命名中其他注意事项
1) 以上命名都不得超过30个字符的系统限制。变量名的长度限制为29(不包括标识字符@)。
2) 数据对象、变量的命名都采用英文字符,禁止使用中文命名。绝对不要在对象名的字符之间留空格。
3) 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突
5) 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。

㈥ PHP的算法可以实现大数据分析吗

1.Bloom filter

适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集

基本原理及要点:
对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。

还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小及hash函数个数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为 0,则m 应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。

举个例子我们假设错误率为0.01,则此时m应大概是n的13倍。这样k大概是8个。

注意这里m与n的单位不同,m是bit为单位,而n则是以元素个数为单位(准确的说是不同元素的个数)。通常单个元素的长度都是有很多bit的。所以使用bloom filter内存上通常都是节省的。

扩展:
Bloom filter将集合中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个集合中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter中的最小值来近似表示元素的出现频率。

问题实例:给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?

根据这个问题我们来计算下内存的占用,4G=2^32大概是40亿*8大概是340亿,n=50亿,如果按出错率0.01算需要的大概是650亿个 bit。现在可用的是340亿,相差并不多,这样可能会使出错率上升些。另外如果这些urlip是一一对应的,就可以转换成ip,则大大简单了。

2.Hashing

适用范围:快速查找,删除的基本数据结构,通常需要总数据量可以放入内存

基本原理及要点:
hash函数选择,针对字符串,整数,排列,具体相应的hash方法。
碰撞处理,一种是open hashing,也称为拉链法;另一种就是closed hashing,也称开地址法,opened addressing。 (http://www.my400800.cn)

扩展:
d-left hashing中的d是多个的意思,我们先简化这个问题,看一看2-left hashing。2-left hashing指的是将一个哈希表分成长度相等的两半,分别叫做T1和T2,给T1和T2分别配备一个哈希函数,h1和h2。在存储一个新的key时,同时用两个哈希函数进行计算,得出两个地址h1[key]和h2[key]。这时需要检查T1中的h1[key]位置和T2中的h2[key]位置,哪一个位置已经存储的(有碰撞的)key比较多,然后将新key存储在负载少的位置。如果两边一样多,比如两个位置都为空或者都存储了一个key,就把新key 存储在左边的T1子表中,2-left也由此而来。在查找一个key时,必须进行两次hash,同时查找两个位置。

问题实例:
1).海量日志数据,提取出某日访问网络次数最多的那个IP。

IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。

3.bit-map

适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下

基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码

扩展:bloom filter可以看做是对bit-map的扩展

问题实例:

1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。

2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map。

4.堆

适用范围:海量数据前n大,并且n比较小,堆可以放入内存

基本原理及要点:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元素。这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。

扩展:双堆,一个最大堆与一个最小堆结合,可以用来维护中位数。

问题实例:
1)100w个数中找最大的前100个数。

用一个100个元素大小的最小堆即可。

5.双层桶划分 ----其实本质上就是【分而治之】的思想,重在“分”的技巧上!

适用范围:第k大,中位数,不重复或重复的数字

基本原理及要点:因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。可以通过多次缩小,双层只是一个例子。

扩展:

问题实例:
1).2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。

2).5亿个int找它们的中位数。

这个例子比上面那个更明显。首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。

实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受的程度。即可以先将int64分成2^24个区域,然后确定区域的第几大数,在将该区域分成2^20个子区域,然后确定是子区域的第几大数,然后子区域里的数的个数只有2^20,就可以直接利用direct addr table进行统计了。

6.数据库索引

适用范围:大数据量的增删改查

基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。
扩展:
问题实例:

7.倒排索引(Inverted index)

适用范围:搜索引擎,关键字查询

基本原理及要点:为何叫倒排索引?一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。

以英文为例,下面是要被索引的文本:
T0 = "it is what it is"
T1 = "what is it"
T2 = "it is a banana"
我们就能得到下面的反向文件索引:
"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}
检索的条件"what", "is" 和 "it" 将对应集合的交集。

正向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说文档指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系。

扩展:

问题实例:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。

8.外排序

适用范围:大数据的排序,去重

基本原理及要点:外排序的归并方法,置换选择 败者树原理,最优归并树

扩展:

问题实例:
1).有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。

这个数据具有很明显的特点,词的大小为16个字节,但是内存只有1m做hash有些不够,所以可以用来排序。内存可以当输入缓冲区使用。

9.trie树

适用范围:数据量大,重复多,但是数据种类小可以放入内存

基本原理及要点:实现方式,节点孩子的表示方式

扩展:压缩实现。

问题实例:
1).有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序 。

2).1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?

3).寻找热门查询:查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。

10.分布式处理 maprece

适用范围:数据量大,但是数据种类小可以放入内存

基本原理及要点:将数据交给不同的机器去处理,数据划分,结果归约。

扩展:

问题实例:

1).The canonical example application of MapRece is a process to count the appearances of

each different word in a set of documents:
void map(String name, String document):
// name: document name
// document: document contents
for each word w in document:
EmitIntermediate(w, 1);

void rece(String word, Iterator partialCounts):
// key: a word
// values: a list of aggregated partial counts
int result = 0;
for each v in partialCounts:
result += ParseInt(v);
Emit(result);
Here, each document is split in words, and each word is counted initially with a "1" value by

the Map function, using the word as the result key. The framework puts together all the pairs

with the same key and feeds them to the same call to Rece, thus this function just needs to

sum all of its input values to find the total appearances of that word.

2).海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。

3).一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数的中数(median)?

经典问题分析

上千万or亿数据(有重复),统计其中出现次数最多的前N个数据,分两种情况:可一次读入内存,不可一次读入。

可用思路:trie树+堆,数据库索引,划分子集分别统计,hash,分布式计算,近似统计,外排序

所谓的是否能一次读入内存,实际上应该指去除重复后的数据量。如果去重后数据可以放入内存,我们可以为数据建立字典,比如通过 map,hashmap,trie,然后直接进行统计即可。当然在更新每条数据的出现次数的时候,我们可以利用一个堆来维护出现次数最多的前N个数据,当然这样导致维护次数增加,不如完全统计后在求前N大效率高。

如果数据无法放入内存。一方面我们可以考虑上面的字典方法能否被改进以适应这种情形,可以做的改变就是将字典存放到硬盘上,而不是内存,这可以参考数据库的存储方法。

当然还有更好的方法,就是可以采用分布式计算,基本上就是map-rece过程,首先可以根据数据值或者把数据hash(md5)后的值,将数据按照范围划分到不同的机子,最好可以让数据划分后可以一次读入内存,这样不同的机子负责处理各种的数值范围,实际上就是map。得到结果后,各个机子只需拿出各自的出现次数最多的前N个数据,然后汇总,选出所有的数据中出现次数最多的前N个数据,这实际上就是rece过程。

实际上可能想直接将数据均分到不同的机子上进行处理,这样是无法得到正确的解的。因为一个数据可能被均分到不同的机子上,而另一个则可能完全聚集到一个机子上,同时还可能存在具有相同数目的数据。比如我们要找出现次数最多的前100个,我们将1000万的数据分布到10台机器上,找到每台出现次数最多的前 100个,归并之后这样不能保证找到真正的第100个,因为比如出现次数最多的第100个可能有1万个,但是它被分到了10台机子,这样在每台上只有1千个,假设这些机子排名在1000个之前的那些都是单独分布在一台机子上的,比如有1001个,这样本来具有1万个的这个就会被淘汰,即使我们让每台机子选出出现次数最多的1000个再归并,仍然会出错,因为可能存在大量个数为1001个的发生聚集。因此不能将数据随便均分到不同机子上,而是要根据hash 后的值将它们映射到不同的机子上处理,让不同的机器处理一个数值范围。

而外排序的方法会消耗大量的IO,效率不会很高。而上面的分布式方法,也可以用于单机版本,也就是将总的数据根据值的范围,划分成多个不同的子文件,然后逐个处理。处理完毕之后再对这些单词的及其出现频率进行一个归并。实际上就可以利用一个外排序的归并过程。

另外还可以考虑近似计算,也就是我们可以通过结合自然语言属性,只将那些真正实际中出现最多的那些词作为一个字典,使得这个规模可以放入内存。

㈦ 高分求一PHP+MYSQL 网上书店 毕业设计 源代码

155. 546.55

㈧ PHP中用$_POST['country']传递数值的问题

<select name="country"><option value="1">China<宽老/option></select>
如果value的值必须为1,而不是china 那么你最好还是写个判断吧:
在接收页面。。。
例如:

if($_POST[country]==1){
$country='china';

}else if(){}....
或者用switch 写。。。

用隐藏域,不大察激好!因为 它会把所有败巧袜的值都传过去!

㈨ 大家php mysql多的话是用什么备份工具的

下面提供两种方法,仅供研究使用。
第1种方法:
复制代码 代码如下:
<?php
$host="localhost";
$user="root";
$password="";
$dbname="dbname";
mysql_connect($host,$user,$password);
mysql_select_db($dbname);
$mysql= "set names utf8;";
mysql_query($mysql);
$q1=mysql_query("show tables");
while($t=mysql_fetch_array($q1)){
$table=$t[0];
$q2=mysql_query("show create table `$table`");$sql=mysql_fetch_array($q2);
$mysql.=$sql['Create Table'].";\n";
$q3=mysql_query("select * from `$table`");while($data=mysql_fetch_assoc($q3)){
$keys=array_keys($data);
$keys=array_map('addslashes',$keys);
$keys=join('`,`',$keys);
$keys="`".$keys."`";
$vals=array_values($data);
$vals=array_map('addslashes',$vals);
$vals=join("','",$vals);
$vals="'".$vals."'";
$mysql.="insert into `$table`($keys) values($vals);\n";}
$mysql.="\n";
}
$filename=$dbname.date('Ymj').".sql";
$fp = fopen($filename,'w');
fputs($fp,$mysql);
fclose($fp);
echo "数据备份成功,生成备份文件".$filename;?>
第2种方法:
复制代码 代码如下:
<?php
$host="localhost";
$user="root";
$password="";
$dbname="dbname";
backup_tables($host,$user,$password,$dbname);/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*'){
$link = mysql_connect($host,$user,$pass);mysql_select_db($name,$link);
//get all of the tables
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);}
$return = '';
//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);$num_fields = mysql_num_fields($result);
$return.= 'DROP TABLE '.$table.';';
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));$return.= "\n\n".$row2[1].";\n\n";
for ($i = 0; $i < $num_fields; $i++)
{
while($row = mysql_fetch_row($result))
{
$return.= 'INSERT INTO '.$table.' VALUES(';for($j=0; $j<$num_fields; $j++)
{
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j]);if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ");\n";
}
}
$return.="\n\n\n";
}
//save file
$handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');fwrite($handle,$return);
fclose($handle);
}
?>

㈩ mysql字符串转换成字典

mysql字符串转换成字典可以用php数据表转换成数据字典的程序。网上找到别人写好的php数据表转换成卜洞数据字典的程序export2.php,型高枯修改export2.php中连接数据库的信息(数据库IP、念燃数据库名称、访问数据库的账号密码。

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:335
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:378
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:612
java用什么软件写 发布:2025-05-18 03:56:19 浏览:32
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:107
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:943
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:739
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:803
网卡访问 发布:2025-05-18 03:35:04 浏览:511
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:371