當前位置:首頁 » 編程語言 » 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 瀏覽:31
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:942
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:739
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:802
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:510
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:371