Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Heroku Connect
苦肉の四苦八苦
大久保英樹
自己紹介
• 名前:大久保英樹
• 職業:フリーランスプログラマ
• アカウント:@Oakbow7
• Herokuを扱う案件は8個目くらい?
• Heroku Connectを扱う案件は4個目くらい?
4U Lifecareとなでしこナース
• フォー・ユー・ライフケア株式会社
• https://4ulifecare.com/
• 医療系スタートアップ
• 活用が限定されている医療人材を活かす
• なでしこナース
• https://nad...
なでしこナース
病院・施設看護師
運営者
管理
管理
求人に応募
採用
Heroku Salesforce
Salesforce
なでしこナース
Salesforce
Partner
Commyunity
病院・施設
Heroku
看護師
Salesfoce
運営
Heroku
Connect
今日お話しすること
• Heroku Connectおさらい
• インピーダンスミスマッチその1
• Heroku と Salesforceの双方向同期で、IDをどうするか
• インピーダンスミスマッチその2
• Salesforceのキャメル...
Heroku Connectおさらい
Heroku
Connect
Heroku
Postgres Salesfoce
Heroku Connectおさらい
• SalesforceのオブジェクトとHeroku Postgresのテーブルを双
方向に同期してくれるアドオン
• あくまでも主となるのはSalesforceオブジェクト。同期対象の
オブジェクトとその...
Heroku Connectおさらい
• テーブル作成はHeroku Connectを介してしか行えない(フ
レームワークのマイグレーション機能は原則そのまま使えな
い)
• Salesforce側のオブジェクト定義に依存するので、テーブル名、...
Heroku Connectおさらい
Heroku
Connect
Heroku
Postgres
Salesfoce
Rails
Railsの期待する
データベーススキーマ(理想)
Heroku Connectが作る
データベーススキーマ(現...
Heroku Postgres Salesforce
id
sfid ← sfid
mofid__c ⇄ mofID__c
body__c ⇄ Body__c
read__c ⇄ Read__c
name ⇄ Name
usermofid__c...
インピーダンスミスマッチその1
• PKをうまく同期できない
• Salesforce側のPKはsfid
• Heroku Postgres側のPKはid
インピーダンスミスマッチその1
• 結合にsfidを使用した場合
• Heroku側でレコードをInsert(sfidはNULL)
• InsertしたレコードをSalesforceに同期
• Salesforceでsfidを発番
• 更新した...
インピーダンスミスマッチその1
インピーダンスミスマッチその1解決編
• 結合に外部IDを使う(データ型は文字列型)
• Heroku側でレコードをInsertするときはPostgreSQLのシーケンスを
突っ込む
• Salesforce側でレコードをInsertするときは...
インピーダンスミスマッチその1解決編
インピーダンスミスマッチその1解決編
インピーダンスミスマッチその1解決編
インピーダンスミスマッチその1解決編
インピーダンスミスマッチその1解決編
インピーダンスミスマッチその1解決編
インピーダンスミスマッチその1解決編2
インピーダンスミスマッチその2
• Salesforceはキャメルケース文化なので、オブジェクトや
フィールド名は基本的にキャメルケース
• カスタムオブジェクトやカスタムフィールドは、末尾に__cが
必ずつく(キモい)
• PostgreSQ...
インピーダンスミスマッチその2
Rails(理想) PostgreSQL(現実) Salesforce
updated_at systemmodstamp SystemModStamp
created_at createddate Create...
インピーダンスミスマッチその2解決編
Rails Model
DB View
(Updatable
View)
DB Table
インピーダンスミスマッチその2解決編
インピーダンスミスマッチその2解決編
インピーダンスミスマッチその2解決編
インピーダンスミスマッチその2解決編
インピーダンスミスマッチその2解決編
インピーダンスミスマッチその2解決編
環境 環境変数 Salesforce テーブル作成 カラム追加 カラム削除
ローカル開発 development なし される される される
ローカルテス
ト
test なし される される される
CI...
ミスマッチを解消
Heroku
Connect
Heroku
Postgres
Salesfoce
Rails
Railsで扱いやすいように作った
更新可能ビュー
Heroku Connectが作る
salesforceスキーマ
Heroku ...
現在の開発サイクル
Review App
feature branchlocal Circle CI
master branch Staging
Production
Pull Request Auto Testing
Merge
Auto D...
現在の開発サイクル
Heroku connect 苦肉の四苦八苦
Upcoming SlideShare
Loading in …5
×

Heroku connect 苦肉の四苦八苦

854 views

Published on

Heroku Connectを、モダンWebフレームワーク(Rails)で扱った際のノウハウをまとめました。

Published in: Engineering
  • 登壇時に見て喋るための走り書きですが、ノートに詳細の説明書いているのでダウンロード推奨です
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

Heroku connect 苦肉の四苦八苦

  1. 1. Heroku Connect 苦肉の四苦八苦 大久保英樹
  2. 2. 自己紹介 • 名前:大久保英樹 • 職業:フリーランスプログラマ • アカウント:@Oakbow7 • Herokuを扱う案件は8個目くらい? • Heroku Connectを扱う案件は4個目くらい?
  3. 3. 4U Lifecareとなでしこナース • フォー・ユー・ライフケア株式会社 • https://4ulifecare.com/ • 医療系スタートアップ • 活用が限定されている医療人材を活かす • なでしこナース • https://nadeshikonurse.jp/ • 看護師向けの人材紹介サービス • 利用ユーザは看護師と病院・施設
  4. 4. なでしこナース 病院・施設看護師 運営者 管理 管理 求人に応募 採用 Heroku Salesforce Salesforce
  5. 5. なでしこナース Salesforce Partner Commyunity 病院・施設 Heroku 看護師 Salesfoce 運営 Heroku Connect
  6. 6. 今日お話しすること • Heroku Connectおさらい • インピーダンスミスマッチその1 • Heroku と Salesforceの双方向同期で、IDをどうするか • インピーダンスミスマッチその2 • Salesforceのキャメルケース文化とRailsのスネークケース文化の ギャップの解消 • 現在の開発サイクル
  7. 7. Heroku Connectおさらい Heroku Connect Heroku Postgres Salesfoce
  8. 8. Heroku Connectおさらい • SalesforceのオブジェクトとHeroku Postgresのテーブルを双 方向に同期してくれるアドオン • あくまでも主となるのはSalesforceオブジェクト。同期対象の オブジェクトとそのカラムをHeroku Connectコンソールで選 択すると、オブジェクトに対応したテーブルが自動生成される。 逆方向はできない • Heroku PostgreSQL -> Salesforceの同期時、Salesforceの ヴァリデーションに引っかかると同期エラーが起きる。
  9. 9. Heroku Connectおさらい • テーブル作成はHeroku Connectを介してしか行えない(フ レームワークのマイグレーション機能は原則そのまま使えな い) • Salesforce側のオブジェクト定義に依存するので、テーブル名、 カラム名やデータ型、データ長さは変更できない • 親と子どちらのレコードが先に同期されるか分からないので、 FK(外部参照制約)は使えない(貼ることは可能だが、FKエ ラーで同期失敗する) • サロゲートキーとしてIDカラムが生成されるが、Salesforce側 には同期されない
  10. 10. Heroku Connectおさらい Heroku Connect Heroku Postgres Salesfoce Rails Railsの期待する データベーススキーマ(理想) Heroku Connectが作る データベーススキーマ(現実) Heroku Postgres
  11. 11. Heroku Postgres Salesforce id sfid ← sfid mofid__c ⇄ mofID__c body__c ⇄ Body__c read__c ⇄ Read__c name ⇄ Name usermofid__c ⇄ UserMofId__c user__c ⇄ User__c conversationmofid__c ⇄ ConversationMofId__c conversation__c ⇄ Conversation__c createddate ⇄ CreatedDate systemmodstamp ⇄ SystemModStamp isdeleted ⇄ IsDeleted conversations__r__mofid__c user__r__mofid__c
  12. 12. インピーダンスミスマッチその1 • PKをうまく同期できない • Salesforce側のPKはsfid • Heroku Postgres側のPKはid
  13. 13. インピーダンスミスマッチその1 • 結合にsfidを使用した場合 • Heroku側でレコードをInsert(sfidはNULL) • InsertしたレコードをSalesforceに同期 • Salesforceでsfidを発番 • 更新したレコードをHeroku Postgresに同期 • PKを取得するために同期が二回必要 • HerokuにとってはSalesforceは所詮外部サービスなので、PKが外部 依存なのは開発する上で非常に不利(ローカルでどう開発する?テ ストは?CIで回せる?)
  14. 14. インピーダンスミスマッチその1
  15. 15. インピーダンスミスマッチその1解決編 • 結合に外部IDを使う(データ型は文字列型) • Heroku側でレコードをInsertするときはPostgreSQLのシーケンスを 突っ込む • Salesforce側でレコードをInsertするときは、トリガでsfidを突っ込 む(1トランザクションで実行するよう頑張る) • idでもsfidでもない外部IDカラムexernal_id(ExternalId__c)を作り、 これを同期する。 • Heroku Postgres ではこのカラムをPKに指定(照合順序に注意) • Salesforceではこのカラムを外部IDとして設定する
  16. 16. インピーダンスミスマッチその1解決編
  17. 17. インピーダンスミスマッチその1解決編
  18. 18. インピーダンスミスマッチその1解決編
  19. 19. インピーダンスミスマッチその1解決編
  20. 20. インピーダンスミスマッチその1解決編
  21. 21. インピーダンスミスマッチその1解決編
  22. 22. インピーダンスミスマッチその1解決編2
  23. 23. インピーダンスミスマッチその2 • Salesforceはキャメルケース文化なので、オブジェクトや フィールド名は基本的にキャメルケース • カスタムオブジェクトやカスタムフィールドは、末尾に__cが 必ずつく(キモい) • PostgreSQLのテーブル名やカラム名は大文字小文字を区別し ない(ので、小文字で表現される) • Railsはスネークケース文化 • レコードの作成日時、更新日時のフィールド名(カラム名)は それぞれ異なっている
  24. 24. インピーダンスミスマッチその2 Rails(理想) PostgreSQL(現実) Salesforce updated_at systemmodstamp SystemModStamp created_at createddate CreatedDate work_location_address1 worklocationaddress1__c WorkLocationAddress1__c contract_start_on contractstartdate__c ContractStartDate__c emergency_contact_details emergencycontactdetails__c EmergencyContactDetails__c id externalid ExternalId opportunity_technical_skill opportunitytechnicalskill__c OpportunityTechnicalSkill__c
  25. 25. インピーダンスミスマッチその2解決編 Rails Model DB View (Updatable View) DB Table
  26. 26. インピーダンスミスマッチその2解決編
  27. 27. インピーダンスミスマッチその2解決編
  28. 28. インピーダンスミスマッチその2解決編
  29. 29. インピーダンスミスマッチその2解決編
  30. 30. インピーダンスミスマッチその2解決編
  31. 31. インピーダンスミスマッチその2解決編 環境 環境変数 Salesforce テーブル作成 カラム追加 カラム削除 ローカル開発 development なし される される される ローカルテス ト test なし される される される CI test なし される される される Review App production なし される される される ステージング production あり されない されない されない 本番 production あり されない されない されない
  32. 32. ミスマッチを解消 Heroku Connect Heroku Postgres Salesfoce Rails Railsで扱いやすいように作った 更新可能ビュー Heroku Connectが作る salesforceスキーマ Heroku Postgres
  33. 33. 現在の開発サイクル Review App feature branchlocal Circle CI master branch Staging Production Pull Request Auto Testing Merge Auto Deployment Promoting Create Review App
  34. 34. 現在の開発サイクル

×