SlideShare a Scribd company logo
改善 Programmer	
  生活的	
  
SQL	
  技能 #1	
  
Rack	
  Lin	
  阿土伯 	
  @RubyTue24	
  
about:me	
  
•  ViViPOS	
  Co.,	
  Ltd	
  	
  技術總監	
  
–  利用 JavaScript	
  寫 〞收銀機〞(傳統產業,全新感
受)	
  
•  PHP	
  /	
  JavaScript	
  LiveScript	
  /	
  Java	
  (目前移情於
Scala	
  )	
  
	
  
•  racklin@gmail.com	
  
•  hKps://twiKer.com/racklin	
  
•  hKp://www.plurk.com/racklin	
  
•  hKps://www.facebook.com/racklin1002	
  
一開始題目是	
  
• Programmer	
  如何與	
  
	
  	
  	
  	
  	
  DBA	
  真心相愛	
  
但是	
  
• Programmer	
  如何與	
  
	
  	
  	
  	
  	
  DBA	
  真心相愛	
  
• 苦命的 PG	
  通常兼 DBA	
  
今天也不談 DBA	
  
•  這裡有堂課好便宜	
  
	
  
– OCP-­‐DBA	
  
	
  
今天也不是 SQL 教學	
  
何謂	
  
• 改善 Programmer 生活	
  
– 更快、更好、更簡潔	
  
– 多一點時間陪家人、朋友	
  
– 別限制在框架中	
  
關於 Rails	
  
By	
  ihower	
  
Rails	
  對其它語言影響	
  
By	
  ihower	
  
Rails	
  超讚,影響深遠	
  
在 ruby	
  場子,政治正確	
  
但是關於 ORM	
  ….	
  
•  hKp://file.ithome.com.tw/20120720/401_1615-­‐1710%20JRuby_Wang-­‐
Shen%20Lu.pdf	
  
你了解 ORM	
  做了什麼嗎?	
  
•  Rails	
  
•  Java	
  
– Hibernate	
  
– Grails	
  
•  PHP	
  
– Lavara	
  
– Phalcon	
  
– CakePHP	
  
CakePHP	
  2.3.6	
  #1	
  
CakePHP	
  2.3.6	
  #2	
  
你的 DB	
  只做 CRUD ?	
  
•  CREATE	
  TABLE	
  
INSERT	
  INTO	
  
SELECT	
  
DELETE	
  FROM	
  	
  
	
  
老舊的 Database	
  Server	
  ?	
  
•  mSQL	
  ?	
  (1993)	
  
•  MySQL	
  <	
  3.x	
  ?	
  	
  
ORM	
  迷思	
  
•  ORM	
  開發者企圖簡化了使用者直接操作
SQL	
  ,	
  但不會產出 “較美觀”SQL	
  .	
  
– hasAndBelongsToMany	
  (CAKEPHP	
  SourceCode)	
  
•  SELECT	
  a	
  from	
  A	
  where	
  a	
  IN(	
  …………..	
  )	
  產出超長 SQL	
  。	
  
•  上線一陣子後就死的不明不白。	
  
•  ORM	
  開發者企圖讓您在各個資料庫平台中
移植你的程式,所以不會產出 “最佳
化”SQL.	
  
	
  	
  
關於 MySQL	
  
•  曾經我也是用 MySQL	
  ,直到我膝蓋中了一
箭。	
  
	
  
– SELECT	
  *	
  FROM	
  users	
  WHERE	
  username=‘rack’	
  
AND	
  paswd	
  =	
  0;	
  
	
  
– hKp://sqlfiddle.com/#!2/pf31/5/0	
  
‘STRING’	
  is	
  equal	
  to	
  0	
  
Type	
  handling	
  
•  了解 Framework	
  如何處理變數	
  
– DB	
  Column	
  Type	
  or	
  Input	
  Data	
  Type	
  ?	
  	
  
– bindParam	
  with	
  custom	
  query	
  
•  SELECT	
  a.user	
  as	
  aa	
  ,	
  a.passwd	
  as	
  bb	
  WHERE	
  aa	
  =	
  ?	
  AND	
  	
  
bb	
  =	
  ?	
  
•  Resqul	
  Services	
  
•  XML	
  
•  JSON	
  
PostgreSQL	
  Type	
  Handling	
  
看到這 Hint	
  ,	
  感動到眼淚都流下來了!	
  
今天的 DEMO	
  是基於	
  
PostgreSQL	
  9.2	
  	
  
Database	
  被搞壞了	
  
Schema	
  
•  Linux	
  CHROOT	
  ,	
  FreeBSD	
  jail	
  .	
  
	
  
•  Per	
  User	
  Schema	
  
–  永遠不要信任:	
  
•  使用者	
  
•  新手開發者	
  
•  Per	
  App	
  Schema	
  
–  正式環境中的 Staging	
  
•  Schema	
  And	
  search_path	
  .	
  
Schema	
  in	
  VIVIPOS	
  
•  SELECT	
  COUNT(schema_name)	
  as	
  K	
  FROM	
  
informaton_schema.schemata;	
  
– 	
  372	
  schema	
  
– 為難搞的客戶和新手鎖在建立獨立的 Schema	
  	
  
Database	
  變慢	
  
Big	
  Data	
  !?	
  
Big	
  定義是什麼?	
  
Big	
  Data	
  
•  你的	
  Big	
  Data	
  
–  百萬筆級	
  
•  別人的 Small	
  Data	
  	
  
–  VIVIPOS	
  單一客戶	
  	
  	
  -­‐	
  (ec2	
  large	
  +	
  500G	
  EBS)	
  
•  1000	
  	
  	
  	
  transactons/day	
  
•  1500	
  	
  	
  	
  clients	
  	
  
•  4	
  *365	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  years	
  
=	
  2,190,000,000	
  	
  	
  	
  (21億筆)	
  
•  我的 Big	
  Data,	
  金融業的 Small	
  Data	
  
–  一天幾百萬上下	
  
PostgreSQL	
  特殊功能	
  
•  Partton	
  Table	
  
•  Partal	
  Index	
  
•  DBLink	
  
– Connect	
  Remote	
  DB	
  Server	
  as	
  View	
  
•  Data	
  Wrappers	
  
– MySQL	
  /	
  Oracle	
  /	
  Redis	
  /	
  Mongo
hKp://wiki.postgresql.org/wiki/Foreign_data_wrappers	
  
Database	
  View	
  
•  Fine-­‐grained	
  Views	
  
– Users	
  Table	
  
•  Username,password,email,cellphones…..	
  
– Views	
  
•  user_auths	
  	
  (username,	
  password)	
  
•  User_profiles	
  (不含 password)	
  
	
  
•  Mapping	
  Model	
  to	
  VIEW	
  
•  降低 Mass	
  Assignment	
  帶來的風險.	
  
	
  
Updatable	
  View	
  
•  View	
  是唯讀的	
  
– Model	
  Mapping	
  to	
  View 也是唯讀的.	
  	
  
•  MySQL	
  5.5	
  後支援	
  
•  PostgreSQL	
  
– USE	
  RULE	
  
CREATE	
  RULE	
  user_login_update	
  AS	
  	
  ON	
  UPDATE	
  TO	
  user_login	
  
	
  	
  DO	
  INSTEAD	
  	
  
	
  	
  	
  	
  UPDATE	
  users	
  SET	
  password	
  =	
  new.password	
  	
  	
  
	
  	
  	
  	
  WHERE	
  users.account	
  =	
  new.account;	
  
	
  
Database	
  View	
  
•  Simplify	
  Model	
  associatons	
  
–  User	
  
•  belongsTo	
  Compony	
  
–  Compony	
  
•  hasMany	
  User	
  
•  belongsTo	
  Region	
  
–  Region	
  
•  hasMany	
  Machine	
  
•  Get	
  User	
  Machines	
  Lists	
  ?	
  
–  N+1	
  Query	
  ?	
  	
  
–  Prepare	
  in	
  Controller	
  ?	
  
Database	
  View	
  
•  建立 user_machines	
  VIEW	
  
	
  
	
  
	
  
•  Mapping	
  UserMachine	
  to	
  ‘user_machines’	
  
VIEW	
  
CREATE	
  View	
  user_machines	
  AS	
  (	
  
SELECT	
  u.id	
  as	
  user_id,	
  m.*	
  FROM	
  users	
  u	
  
INNER	
  JOIN	
  user_componies	
  ….	
  
INNER	
  JOIN	
  compony_regions	
  ….	
  
LEFT	
  JOIN	
  region_machines	
  ……	
  
)	
  
	
  
Complex	
  SQL	
  and	
  Joins	
  
未完! 待續……..	
  共四頁!	
  
Complex	
  SQL	
  and	
  Joins	
  
•  需要多個 Sub-­‐Query	
  	
  
•  需要 Temporary	
  Table	
  儲存運算過程中的資
料,並重覆引用	
  
•  SQL	
  複雜到爸媽都認不得	
  
	
  
	
  
Common	
  Table	
  Expression	
  
•  在單⼀一	
  SELECT、INSERT、UPDATE、DELETE	
  
或	
  CREATE	
  VIEW	
  陳述式之執⾏行範圍內定義
的暫存結果集。CTE	
  與衍⽣生資料表類似的地
⽅方在於,它不會儲存為物件,⽽而且其⽣生命
週期僅限於查詢期間.	
  
– 建⽴立遞迴查詢	
  
– 您不需要在中繼資料中儲存定義	
  
– 在相同陳述式中多次參考結果資料表	
  
CTE	
  Example	
  
•  Top	
  Terminal	
  Product	
  Sales	
  
– Products_in_top_terminals	
  
CTE	
  Example	
  
•  Top	
  Terminal	
  Product	
  Sales	
  
– Products_in_top_terminals	
  
天不從人願	
  
•  貨幣匯率表	
  
Create	
  Table	
  exgRate	
  (	
  
	
  	
  	
  exgRateId	
  serial	
  primary	
  key,	
  -­‐-­‐	
  主鍵	
  
	
  	
  	
  factTime	
  tmestamp,	
  	
  	
  	
   	
  	
  	
  	
  	
  	
  	
  -­‐-­‐	
  匯入時間	
  
	
  	
  	
  currency	
  char(3),	
  	
  	
  	
  	
  	
  	
  	
  	
  	
    	
  	
  	
  -­‐-­‐	
  貨幣別	
  
	
  	
  	
  purpose	
  varchar(2),	
  	
  	
   	
  	
  	
  	
  	
  	
  	
  	
  -­‐-­‐	
  匯率種類	
  
	
  	
  	
  currType	
  varchar(10),	
  	
  	
  	
  	
   	
  	
  	
  	
  -­‐-­‐	
  貨幣種類	
  
	
  	
  	
  rate	
  numeric(18,6)	
  	
  	
  	
  	
  	
  	
  	
  	
   	
  	
  	
  -­‐-­‐	
  匯率	
  
);	
  
工程師角度期望的報表	
  
客戶期望報表1	
  
客戶期望報表2	
  
一個月後…………	
  	
  
客戶期望報表N	
  
三個月後…………	
  	
  
Data	
  Mining	
  ?	
  
•  RD	
  找 PM	
  抱怨	
  
•  PM	
  找客戶抱怨	
  
•  客戶向天抱怨	
  
– 為什麼 Data	
  Mining	
  變成 Data	
  Money	
  $$$	
  
PIVOT	
  /	
  Crosstab	
  
•  一般稱為「樞紐分析表」,PostgreSQL	
  為
「交叉表」	
  
•  SELECT	
  *	
  FROM	
  crosstab('...')	
  AS	
  ct(row_name	
  
text,	
  category_1	
  text,	
  category_2	
  text);	
  
crosstab	
  demo	
  
•  客戶報表其實很簡單!	
  
– 客戶期望表 N	
  -­‐	
  Crosstab_2	
  
	
  
Stored	
  Procedure	
  
OK!	
  	
  那我們跳過不談 Stored	
  Procedure	
  .	
  
Trigger	
  
•  觸發程序是⼀一種在資料庫伺服器發⽣生事件
時,會⾃自動執⾏行的特殊預存程序	
  
– Logging	
  	
  
•  Logging	
  in	
  controller	
  !?	
  
– Backup	
  data	
  
– Calling	
  Stored	
  Procedure	
  from	
  Triggers	
  
PLV8	
  
PostgreSQL	
  procedual	
  language	
  powered	
  by	
  V8	
  
JavaScript	
  Engine	
  
1003	
  tables	
  in	
  cookpad?	
  
PostgreSQL	
  on	
  the	
  Mac	
  
•  Postgres.app	
  
postgres.heroku.com	
  
Thanks	
  

More Related Content

What's hot (18)

Mysql调优
Mysql调优Mysql调优
Mysql调优
ken shin
 
数据库内核分享——第一期
数据库内核分享——第一期数据库内核分享——第一期
数据库内核分享——第一期
frogd
 
Team Foundation Server
Team Foundation ServerTeam Foundation Server
Team Foundation Server
國昭 張
 
Google LevelDB Study Discuss
Google LevelDB Study DiscussGoogle LevelDB Study Discuss
Google LevelDB Study Discuss
everestsun
 
如何针对业务做DB优化
如何针对业务做DB优化如何针对业务做DB优化
如何针对业务做DB优化
Jinrong Ye
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展
Hesey
 
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
drewz lin
 
1号店数据库架构
1号店数据库架构1号店数据库架构
1号店数据库架构
Louis liu
 
对MySQL的一些改进想法和实现
对MySQL的一些改进想法和实现对MySQL的一些改进想法和实现
对MySQL的一些改进想法和实现
Lixun Peng
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹
國昭 張
 
Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案
美团技术团队
 
性能优化
性能优化性能优化
性能优化
Lu Wei
 
Leveldb background
Leveldb backgroundLeveldb background
Leveldb background
宗志 陈
 
MySQL运维那些事
MySQL运维那些事MySQL运维那些事
MySQL运维那些事
Jinrong Ye
 
Buffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracleBuffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracle
frogd
 
MySQL设计、优化、运维
MySQL设计、优化、运维MySQL设计、优化、运维
MySQL设计、优化、运维
Jinrong Ye
 
Mysql调优
Mysql调优Mysql调优
Mysql调优
ken shin
 
数据库内核分享——第一期
数据库内核分享——第一期数据库内核分享——第一期
数据库内核分享——第一期
frogd
 
Team Foundation Server
Team Foundation ServerTeam Foundation Server
Team Foundation Server
國昭 張
 
Google LevelDB Study Discuss
Google LevelDB Study DiscussGoogle LevelDB Study Discuss
Google LevelDB Study Discuss
everestsun
 
如何针对业务做DB优化
如何针对业务做DB优化如何针对业务做DB优化
如何针对业务做DB优化
Jinrong Ye
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展
Hesey
 
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
drewz lin
 
1号店数据库架构
1号店数据库架构1号店数据库架构
1号店数据库架构
Louis liu
 
对MySQL的一些改进想法和实现
对MySQL的一些改进想法和实现对MySQL的一些改进想法和实现
对MySQL的一些改进想法和实现
Lixun Peng
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹
國昭 張
 
Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案
美团技术团队
 
性能优化
性能优化性能优化
性能优化
Lu Wei
 
Leveldb background
Leveldb backgroundLeveldb background
Leveldb background
宗志 陈
 
MySQL运维那些事
MySQL运维那些事MySQL运维那些事
MySQL运维那些事
Jinrong Ye
 
Buffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracleBuffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracle
frogd
 
MySQL设计、优化、运维
MySQL设计、优化、运维MySQL设计、优化、运维
MySQL设计、优化、运维
Jinrong Ye
 

Similar to 改善Programmer生活的sql技能 (20)

Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Justin Lin
 
MySQL進階介紹
MySQL進階介紹MySQL進階介紹
MySQL進階介紹
Stanley Huang
 
MySQL入門介紹
MySQL入門介紹MySQL入門介紹
MySQL入門介紹
Stanley Huang
 
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
 
Enterprise Data Lake in Action
Enterprise Data Lake in ActionEnterprise Data Lake in Action
Enterprise Data Lake in Action
Jazz Yao-Tsung Wang
 
PostgreSQL Introduction V0.1
PostgreSQL Introduction V0.1PostgreSQL Introduction V0.1
PostgreSQL Introduction V0.1
March Liu
 
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
開放原始碼 Ch2.4   app - oss - db (ver 1.0)開放原始碼 Ch2.4   app - oss - db (ver 1.0)
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
My own sweet home!
 
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Etu Solution
 
Python 数据库技术第三讲
Python 数据库技术第三讲Python 数据库技术第三讲
Python 数据库技术第三讲
March Liu
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDB
Monster Supreme
 
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
Yi-Feng Tzeng
 
Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
 
現代資料庫
現代資料庫現代資料庫
現代資料庫
Jasper Chen
 
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
Yi-Feng Tzeng
 
1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计
RolfZhang
 
老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統
Mu Chun Wang
 
3小时 快速了解postgre sql
3小时 快速了解postgre sql3小时 快速了解postgre sql
3小时 快速了解postgre sql
Michael Fan
 
The Evolution of Data Systems
The Evolution of Data SystemsThe Evolution of Data Systems
The Evolution of Data Systems
宇 傅
 
從統計到資料科學
從統計到資料科學從統計到資料科學
從統計到資料科學
Terence Huang
 
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Justin Lin
 
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
 
PostgreSQL Introduction V0.1
PostgreSQL Introduction V0.1PostgreSQL Introduction V0.1
PostgreSQL Introduction V0.1
March Liu
 
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
開放原始碼 Ch2.4   app - oss - db (ver 1.0)開放原始碼 Ch2.4   app - oss - db (ver 1.0)
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
My own sweet home!
 
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Etu Solution
 
Python 数据库技术第三讲
Python 数据库技术第三讲Python 数据库技术第三讲
Python 数据库技术第三讲
March Liu
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDB
Monster Supreme
 
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
Yi-Feng Tzeng
 
Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
 
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
Yi-Feng Tzeng
 
1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计
RolfZhang
 
老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統
Mu Chun Wang
 
3小时 快速了解postgre sql
3小时 快速了解postgre sql3小时 快速了解postgre sql
3小时 快速了解postgre sql
Michael Fan
 
The Evolution of Data Systems
The Evolution of Data SystemsThe Evolution of Data Systems
The Evolution of Data Systems
宇 傅
 
從統計到資料科學
從統計到資料科學從統計到資料科學
從統計到資料科學
Terence Huang
 
Ad

改善Programmer生活的sql技能

  • 1. 改善 Programmer  生活的   SQL  技能 #1   Rack  Lin  阿土伯  @RubyTue24  
  • 2. about:me   •  ViViPOS  Co.,  Ltd    技術總監   –  利用 JavaScript  寫 〞收銀機〞(傳統產業,全新感 受)   •  PHP  /  JavaScript  LiveScript  /  Java  (目前移情於 Scala  )     •  [email protected]   •  hKps://twiKer.com/racklin   •  hKp://www.plurk.com/racklin   •  hKps://www.facebook.com/racklin1002  
  • 3. 一開始題目是   • Programmer  如何與            DBA  真心相愛  
  • 4. 但是   • Programmer  如何與            DBA  真心相愛   • 苦命的 PG  通常兼 DBA  
  • 5. 今天也不談 DBA   •  這裡有堂課好便宜     – OCP-­‐DBA     今天也不是 SQL 教學  
  • 6. 何謂   • 改善 Programmer 生活   – 更快、更好、更簡潔   – 多一點時間陪家人、朋友   – 別限制在框架中  
  • 7. 關於 Rails   By  ihower  
  • 9. Rails  超讚,影響深遠   在 ruby  場子,政治正確  
  • 10. 但是關於 ORM  ….   •  hKp://file.ithome.com.tw/20120720/401_1615-­‐1710%20JRuby_Wang-­‐ Shen%20Lu.pdf  
  • 11. 你了解 ORM  做了什麼嗎?   •  Rails   •  Java   – Hibernate   – Grails   •  PHP   – Lavara   – Phalcon   – CakePHP  
  • 14. 你的 DB  只做 CRUD ?   •  CREATE  TABLE   INSERT  INTO   SELECT   DELETE  FROM      
  • 15. 老舊的 Database  Server  ?   •  mSQL  ?  (1993)   •  MySQL  <  3.x  ?    
  • 16. ORM  迷思   •  ORM  開發者企圖簡化了使用者直接操作 SQL  ,  但不會產出 “較美觀”SQL  .   – hasAndBelongsToMany  (CAKEPHP  SourceCode)   •  SELECT  a  from  A  where  a  IN(  …………..  )  產出超長 SQL  。   •  上線一陣子後就死的不明不白。   •  ORM  開發者企圖讓您在各個資料庫平台中 移植你的程式,所以不會產出 “最佳 化”SQL.      
  • 17. 關於 MySQL   •  曾經我也是用 MySQL  ,直到我膝蓋中了一 箭。     – SELECT  *  FROM  users  WHERE  username=‘rack’   AND  paswd  =  0;     – hKp://sqlfiddle.com/#!2/pf31/5/0  
  • 19. Type  handling   •  了解 Framework  如何處理變數   – DB  Column  Type  or  Input  Data  Type  ?     – bindParam  with  custom  query   •  SELECT  a.user  as  aa  ,  a.passwd  as  bb  WHERE  aa  =  ?  AND     bb  =  ?   •  Resqul  Services   •  XML   •  JSON  
  • 20. PostgreSQL  Type  Handling   看到這 Hint  ,  感動到眼淚都流下來了!  
  • 21. 今天的 DEMO  是基於   PostgreSQL  9.2    
  • 23. Schema   •  Linux  CHROOT  ,  FreeBSD  jail  .     •  Per  User  Schema   –  永遠不要信任:   •  使用者   •  新手開發者   •  Per  App  Schema   –  正式環境中的 Staging   •  Schema  And  search_path  .  
  • 24. Schema  in  VIVIPOS   •  SELECT  COUNT(schema_name)  as  K  FROM   informaton_schema.schemata;   –   372  schema   – 為難搞的客戶和新手鎖在建立獨立的 Schema    
  • 25. Database  變慢   Big  Data  !?  
  • 27. Big  Data   •  你的  Big  Data   –  百萬筆級   •  別人的 Small  Data     –  VIVIPOS  單一客戶      -­‐  (ec2  large  +  500G  EBS)   •  1000        transactons/day   •  1500        clients     •  4  *365                    years   =  2,190,000,000        (21億筆)   •  我的 Big  Data,  金融業的 Small  Data   –  一天幾百萬上下  
  • 28. PostgreSQL  特殊功能   •  Partton  Table   •  Partal  Index   •  DBLink   – Connect  Remote  DB  Server  as  View   •  Data  Wrappers   – MySQL  /  Oracle  /  Redis  /  Mongo hKp://wiki.postgresql.org/wiki/Foreign_data_wrappers  
  • 29. Database  View   •  Fine-­‐grained  Views   – Users  Table   •  Username,password,email,cellphones…..   – Views   •  user_auths    (username,  password)   •  User_profiles  (不含 password)     •  Mapping  Model  to  VIEW   •  降低 Mass  Assignment  帶來的風險.    
  • 30. Updatable  View   •  View  是唯讀的   – Model  Mapping  to  View 也是唯讀的.     •  MySQL  5.5  後支援   •  PostgreSQL   – USE  RULE   CREATE  RULE  user_login_update  AS    ON  UPDATE  TO  user_login      DO  INSTEAD            UPDATE  users  SET  password  =  new.password              WHERE  users.account  =  new.account;    
  • 31. Database  View   •  Simplify  Model  associatons   –  User   •  belongsTo  Compony   –  Compony   •  hasMany  User   •  belongsTo  Region   –  Region   •  hasMany  Machine   •  Get  User  Machines  Lists  ?   –  N+1  Query  ?     –  Prepare  in  Controller  ?  
  • 32. Database  View   •  建立 user_machines  VIEW         •  Mapping  UserMachine  to  ‘user_machines’   VIEW   CREATE  View  user_machines  AS  (   SELECT  u.id  as  user_id,  m.*  FROM  users  u   INNER  JOIN  user_componies  ….   INNER  JOIN  compony_regions  ….   LEFT  JOIN  region_machines  ……   )    
  • 33. Complex  SQL  and  Joins   未完! 待續……..  共四頁!  
  • 34. Complex  SQL  and  Joins   •  需要多個 Sub-­‐Query     •  需要 Temporary  Table  儲存運算過程中的資 料,並重覆引用   •  SQL  複雜到爸媽都認不得      
  • 35. Common  Table  Expression   •  在單⼀一  SELECT、INSERT、UPDATE、DELETE   或  CREATE  VIEW  陳述式之執⾏行範圍內定義 的暫存結果集。CTE  與衍⽣生資料表類似的地 ⽅方在於,它不會儲存為物件,⽽而且其⽣生命 週期僅限於查詢期間.   – 建⽴立遞迴查詢   – 您不需要在中繼資料中儲存定義   – 在相同陳述式中多次參考結果資料表  
  • 36. CTE  Example   •  Top  Terminal  Product  Sales   – Products_in_top_terminals  
  • 37. CTE  Example   •  Top  Terminal  Product  Sales   – Products_in_top_terminals  
  • 38. 天不從人願   •  貨幣匯率表   Create  Table  exgRate  (        exgRateId  serial  primary  key,  -­‐-­‐  主鍵        factTime  tmestamp,                       -­‐-­‐  匯入時間        currency  char(3),                            -­‐-­‐  貨幣別        purpose  varchar(2),                       -­‐-­‐  匯率種類        currType  varchar(10),                   -­‐-­‐  貨幣種類        rate  numeric(18,6)                         -­‐-­‐  匯率   );  
  • 43. Data  Mining  ?   •  RD  找 PM  抱怨   •  PM  找客戶抱怨   •  客戶向天抱怨   – 為什麼 Data  Mining  變成 Data  Money  $$$  
  • 44. PIVOT  /  Crosstab   •  一般稱為「樞紐分析表」,PostgreSQL  為 「交叉表」   •  SELECT  *  FROM  crosstab('...')  AS  ct(row_name   text,  category_1  text,  category_2  text);  
  • 45. crosstab  demo   •  客戶報表其實很簡單!   – 客戶期望表 N  -­‐  Crosstab_2    
  • 46. Stored  Procedure   OK!    那我們跳過不談 Stored  Procedure  .  
  • 47. Trigger   •  觸發程序是⼀一種在資料庫伺服器發⽣生事件 時,會⾃自動執⾏行的特殊預存程序   – Logging     •  Logging  in  controller  !?   – Backup  data   – Calling  Stored  Procedure  from  Triggers  
  • 48. PLV8   PostgreSQL  procedual  language  powered  by  V8   JavaScript  Engine  
  • 49. 1003  tables  in  cookpad?  
  • 50. PostgreSQL  on  the  Mac   •  Postgres.app