SlideShare a Scribd company logo
1 of 12
PostgreSQL JSON型と 
Facebook APIを使って 
webアプリ開発をした話 
2014年9月6日 
石井愛弓 
PostgreSQLアンカンファレンス2014@東京
目次 
• 自己紹介 
• webアプリデモ 
• Facebook APIとは? 
• JSON型とは? 
• JSON型を使うとどう変わる? 
• PostgreSQL9.4新機能:JSONB型 
• まとめ
作成したwebアプリ:写真クイズ 
自分のFacebook上の友達のプロフィール写真を表示し、 
名前をあてるクイズ
WEBアプリデモ
開発情報と利用した技術 
○ミドルウェア 
- Apache 2.2.25 
- PHP 5.3.27 
- PostgreSQL 9.3.4 
○フレームワーク 
- CakePHP 2.4.10 
○フロントエンド 
- HTML5 & CSS3 
• Facebook API 
• PostgreSQL JSON型 
技術トピック
Facebook APIとは? 
Facebook Graph API 
• Facebookの様々なオブジェクトへアクセス可能 
• ユーザ情報(名前、誕生日など)、写真、友達、投稿… 
例えばブラウザでhttps://graph.facebook.com/4へアクセスすると… 
{ 
"id": "4", 
"first_name": "Mark", 
"gender": "male", 
"last_name": "Zuckerberg", 
"link": 
"https://www.facebook.com/zuck", 
"locale": "en_US", 
"name": "Mark Zuckerberg", 
"username": "zuck" 
} 
Mark Zuckerbergのユーザ情報がJSONで返ってくる(HTTPの場合) 
※ただし、アクセストークンなしで取得できるのは公開情報のみ
Facebook APIとは? 
• 2014/4/30に2.0にバージョンアップ 
• 友達に対するアクセス権限など変更箇所多数 
• 様々なSDKが用意されている 
(PHP,JavaScript,iOS,Android) 
• アクセストークンの発行などがラク 
• 今回使用したのはPHP SDK
Facebook APIとは? 
☆使用例 
※CakePHPのVendorフォルダにsdkを入れておく 
//読み込み 
App::import('Vendor', 'facebook/src/facebook'); 
//アプリの情報を設定 
$this->facebook = new Facebook( array( 
‘appId’ => ‘ここにid’, 'secret' => ‘ここにsecret’ )); 
//スコープ(ほしいパーミッション)を指定してログインURLを取得 
$login_url = $this->facebook->getLoginUrl(array('scope' => 'user_friends')); 
//リダイレクト 
$this->redirect($login_url); 
//自分の情報を取得 
$me = $this->facebook->api('/me'); 
//友達の情報を取得 
$friend_list = $this->facebook->api('/me/taggable_friends'); 
※アプリのidやsecretはhttp://developers.facebook.com/にて設定
JSON型とは? 
• JSON(JavaScript Object Notation)は軽量データ交換フォーマット 
Ex) {"name": “Ayumi Ishii", "age": 20} 
< PostgreSQL9.3のJSONサポート> 
○JSON型 
※エンコードはUTF-8にする 
・列にJSON型を指定できる(text型に値のチェックがついている) 
○JSON演算子 
・SELECT ‘{“a”:1,“b”:2}’::json->‘b’ ; ⇒ 2を取得 
・SELECT ‘{“a”:[1,2,3],“b”:[4,5,6]}’::json#>‘{a,2}’; ⇒3を取 
得 
○JSONサポート関数 
・SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); 
一番外側の要素の数⇒ 5を取得その他は公式ドキュメントにて
JSON型を使うとどう変わる? 
JSON型を使わなくても、同じアプリを作ることは可能だが… 
• JSONレスポンスをそのままDBに保存できる 
• ただし、PHP SDKでは配列で返ってきた 
• JSON演算子、関数が使える 
・今回のアプリでは… 
アプリのユーザ1人に対し友達が何人いても、友達リストが1タプル 
に収まる 
自分友達 
1 Aさん 
1 Bさん 
1 Cさん 
1 … 
自分友達 
1 ["Aさん","Bさん","Cさん"…]
PostgreSQL9.4新機能:JSONB型 
• PostgreSQL9.4では、新しくJSONBデータ型が追加され 
た 
JSON型とJSONB型の比較 
JSON型JSONB型 
PostgreSQLバージョン9.2以降9.4以降 
データテキストバイナリ 
リパースの必要ありなし 
インデックスサポートなしあり 
要素へのアクセス遅い速い 
重複キーの保持重複して保持重複して保持しない 
キーの順番保持保持しない 
キーの順序を保持したい場合など特別な場合はJSON型にする必要がある 
(JSONには元々順序の概念はないが) 
ほとんどのアプリはJSONB型の方が便利
まとめ 
• PostgreSQL JSON型とFacebook APIを使って 
webアプリ開発 
• JSON型の出番は多そう 
• Ajaxで利用されている 
• APIの戻り値がJSONのケースをよく見かける 
• JSONBに期待が高まる

More Related Content

What's hot

What's hot (12)

Requestsで始める5分前帰社
Requestsで始める5分前帰社Requestsで始める5分前帰社
Requestsで始める5分前帰社
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
 
WEBエンジニア勉強会 #13 LT 資料 データベース2.0
WEBエンジニア勉強会 #13 LT 資料 データベース2.0WEBエンジニア勉強会 #13 LT 資料 データベース2.0
WEBエンジニア勉強会 #13 LT 資料 データベース2.0
 
プログラミング同好会とすごい合同勉強会
プログラミング同好会とすごい合同勉強会プログラミング同好会とすごい合同勉強会
プログラミング同好会とすごい合同勉強会
 
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめあと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
 
pythonでemlファイルを扱う話
pythonでemlファイルを扱う話pythonでemlファイルを扱う話
pythonでemlファイルを扱う話
 
Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!
 
Ocs2012 tokyo/spring plone
Ocs2012 tokyo/spring plone Ocs2012 tokyo/spring plone
Ocs2012 tokyo/spring plone
 
Pythonで業務改善をしたときにあった問題(ライト版)
Pythonで業務改善をしたときにあった問題(ライト版)Pythonで業務改善をしたときにあった問題(ライト版)
Pythonで業務改善をしたときにあった問題(ライト版)
 
データベース2.0 平成ラストバージョン
データベース2.0 平成ラストバージョンデータベース2.0 平成ラストバージョン
データベース2.0 平成ラストバージョン
 
0201 L C
0201  L C0201  L C
0201 L C
 
"プロのプログラマ"を目指す初心者が最初に読むべきたった一冊の本
"プロのプログラマ"を目指す初心者が最初に読むべきたった一冊の本"プロのプログラマ"を目指す初心者が最初に読むべきたった一冊の本
"プロのプログラマ"を目指す初心者が最初に読むべきたった一冊の本
 

Similar to PostgreSQL JSON型と Facebook APIを使って webアプリ開発をした話

Osc2012.dbに行ってきました
Osc2012.dbに行ってきましたOsc2012.dbに行ってきました
Osc2012.dbに行ってきました
Masaru Kobashigawa
 
Tokyowebmining5 yokkuns
Tokyowebmining5 yokkunsTokyowebmining5 yokkuns
Tokyowebmining5 yokkuns
Yohei Sato
 
Scotty + Aeson + Persistentで作るJSON Web API
Scotty + Aeson + Persistentで作るJSON Web APIScotty + Aeson + Persistentで作るJSON Web API
Scotty + Aeson + Persistentで作るJSON Web API
Daisuke Fujimura
 
Phjosh(仮)プロジェクト
Phjosh(仮)プロジェクトPhjosh(仮)プロジェクト
Phjosh(仮)プロジェクト
Moriyoshi Koizumi
 
モバイルOSとWeb標準とそれらへのアプローチ
モバイルOSとWeb標準とそれらへのアプローチモバイルOSとWeb標準とそれらへのアプローチ
モバイルOSとWeb標準とそれらへのアプローチ
Kisato
 

Similar to PostgreSQL JSON型と Facebook APIを使って webアプリ開発をした話 (20)

20170819 ocd-l tthon-pgdev
20170819 ocd-l tthon-pgdev20170819 ocd-l tthon-pgdev
20170819 ocd-l tthon-pgdev
 
MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!
 
Osc2012.dbに行ってきました
Osc2012.dbに行ってきましたOsc2012.dbに行ってきました
Osc2012.dbに行ってきました
 
オープンデータ Web API
オープンデータ Web APIオープンデータ Web API
オープンデータ Web API
 
Tokyowebmining5 yokkuns
Tokyowebmining5 yokkunsTokyowebmining5 yokkuns
Tokyowebmining5 yokkuns
 
GDG DevFest Kobe Firebaseハンズオン勉強会
GDG DevFest Kobe Firebaseハンズオン勉強会GDG DevFest Kobe Firebaseハンズオン勉強会
GDG DevFest Kobe Firebaseハンズオン勉強会
 
Ojag naha vol13
Ojag naha vol13Ojag naha vol13
Ojag naha vol13
 
Ojag naha vol13
Ojag naha vol13Ojag naha vol13
Ojag naha vol13
 
WordBench京都版 _sハンズオン
WordBench京都版 _sハンズオンWordBench京都版 _sハンズオン
WordBench京都版 _sハンズオン
 
Firebase & BigQuery で Android アプリの成⻑を支える
Firebase & BigQuery で Android アプリの成⻑を支えるFirebase & BigQuery で Android アプリの成⻑を支える
Firebase & BigQuery で Android アプリの成⻑を支える
 
第51回NDS PostgreSQLのデータ型 #nds51
第51回NDS PostgreSQLのデータ型 #nds51第51回NDS PostgreSQLのデータ型 #nds51
第51回NDS PostgreSQLのデータ型 #nds51
 
Spring.project
Spring.projectSpring.project
Spring.project
 
PowerShellでFunction Appしよう!
PowerShellでFunction Appしよう!PowerShellでFunction Appしよう!
PowerShellでFunction Appしよう!
 
JSON:APIについてざっくり入門
JSON:APIについてざっくり入門JSON:APIについてざっくり入門
JSON:APIについてざっくり入門
 
Scotty + Aeson + Persistentで作るJSON Web API
Scotty + Aeson + Persistentで作るJSON Web APIScotty + Aeson + Persistentで作るJSON Web API
Scotty + Aeson + Persistentで作るJSON Web API
 
Phjosh(仮)プロジェクト
Phjosh(仮)プロジェクトPhjosh(仮)プロジェクト
Phjosh(仮)プロジェクト
 
Ocs2013 tokyo spring_plone
Ocs2013 tokyo spring_ploneOcs2013 tokyo spring_plone
Ocs2013 tokyo spring_plone
 
Word pressはじめの一歩 テーマ作成ハンズオン
Word pressはじめの一歩 テーマ作成ハンズオンWord pressはじめの一歩 テーマ作成ハンズオン
Word pressはじめの一歩 テーマ作成ハンズオン
 
モバイルOSとWeb標準とそれらへのアプローチ
モバイルOSとWeb標準とそれらへのアプローチモバイルOSとWeb標準とそれらへのアプローチ
モバイルOSとWeb標準とそれらへのアプローチ
 
Facebook(フェイスブック)とWordPressの連携の仕組みとは?
Facebook(フェイスブック)とWordPressの連携の仕組みとは?Facebook(フェイスブック)とWordPressの連携の仕組みとは?
Facebook(フェイスブック)とWordPressの連携の仕組みとは?
 

Recently uploaded

Recently uploaded (11)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

PostgreSQL JSON型と Facebook APIを使って webアプリ開発をした話

  • 1. PostgreSQL JSON型と Facebook APIを使って webアプリ開発をした話 2014年9月6日 石井愛弓 PostgreSQLアンカンファレンス2014@東京
  • 2. 目次 • 自己紹介 • webアプリデモ • Facebook APIとは? • JSON型とは? • JSON型を使うとどう変わる? • PostgreSQL9.4新機能:JSONB型 • まとめ
  • 5. 開発情報と利用した技術 ○ミドルウェア - Apache 2.2.25 - PHP 5.3.27 - PostgreSQL 9.3.4 ○フレームワーク - CakePHP 2.4.10 ○フロントエンド - HTML5 & CSS3 • Facebook API • PostgreSQL JSON型 技術トピック
  • 6. Facebook APIとは? Facebook Graph API • Facebookの様々なオブジェクトへアクセス可能 • ユーザ情報(名前、誕生日など)、写真、友達、投稿… 例えばブラウザでhttps://graph.facebook.com/4へアクセスすると… { "id": "4", "first_name": "Mark", "gender": "male", "last_name": "Zuckerberg", "link": "https://www.facebook.com/zuck", "locale": "en_US", "name": "Mark Zuckerberg", "username": "zuck" } Mark Zuckerbergのユーザ情報がJSONで返ってくる(HTTPの場合) ※ただし、アクセストークンなしで取得できるのは公開情報のみ
  • 7. Facebook APIとは? • 2014/4/30に2.0にバージョンアップ • 友達に対するアクセス権限など変更箇所多数 • 様々なSDKが用意されている (PHP,JavaScript,iOS,Android) • アクセストークンの発行などがラク • 今回使用したのはPHP SDK
  • 8. Facebook APIとは? ☆使用例 ※CakePHPのVendorフォルダにsdkを入れておく //読み込み App::import('Vendor', 'facebook/src/facebook'); //アプリの情報を設定 $this->facebook = new Facebook( array( ‘appId’ => ‘ここにid’, 'secret' => ‘ここにsecret’ )); //スコープ(ほしいパーミッション)を指定してログインURLを取得 $login_url = $this->facebook->getLoginUrl(array('scope' => 'user_friends')); //リダイレクト $this->redirect($login_url); //自分の情報を取得 $me = $this->facebook->api('/me'); //友達の情報を取得 $friend_list = $this->facebook->api('/me/taggable_friends'); ※アプリのidやsecretはhttp://developers.facebook.com/にて設定
  • 9. JSON型とは? • JSON(JavaScript Object Notation)は軽量データ交換フォーマット Ex) {"name": “Ayumi Ishii", "age": 20} < PostgreSQL9.3のJSONサポート> ○JSON型 ※エンコードはUTF-8にする ・列にJSON型を指定できる(text型に値のチェックがついている) ○JSON演算子 ・SELECT ‘{“a”:1,“b”:2}’::json->‘b’ ; ⇒ 2を取得 ・SELECT ‘{“a”:[1,2,3],“b”:[4,5,6]}’::json#>‘{a,2}’; ⇒3を取 得 ○JSONサポート関数 ・SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); 一番外側の要素の数⇒ 5を取得その他は公式ドキュメントにて
  • 10. JSON型を使うとどう変わる? JSON型を使わなくても、同じアプリを作ることは可能だが… • JSONレスポンスをそのままDBに保存できる • ただし、PHP SDKでは配列で返ってきた • JSON演算子、関数が使える ・今回のアプリでは… アプリのユーザ1人に対し友達が何人いても、友達リストが1タプル に収まる 自分友達 1 Aさん 1 Bさん 1 Cさん 1 … 自分友達 1 ["Aさん","Bさん","Cさん"…]
  • 11. PostgreSQL9.4新機能:JSONB型 • PostgreSQL9.4では、新しくJSONBデータ型が追加され た JSON型とJSONB型の比較 JSON型JSONB型 PostgreSQLバージョン9.2以降9.4以降 データテキストバイナリ リパースの必要ありなし インデックスサポートなしあり 要素へのアクセス遅い速い 重複キーの保持重複して保持重複して保持しない キーの順番保持保持しない キーの順序を保持したい場合など特別な場合はJSON型にする必要がある (JSONには元々順序の概念はないが) ほとんどのアプリはJSONB型の方が便利
  • 12. まとめ • PostgreSQL JSON型とFacebook APIを使って webアプリ開発 • JSON型の出番は多そう • Ajaxで利用されている • APIの戻り値がJSONのケースをよく見かける • JSONBに期待が高まる