Upgrade to Pro — share decks privately, control downloads, hide ads and more …

社内勉強会vol.3@ごーふぁー荘

Aya Ebata
December 05, 2022

 社内勉強会vol.3@ごーふぁー荘

Aya Ebata

December 05, 2022
Tweet

More Decks by Aya Ebata

Other Decks in Programming

Transcript

  1. こんな感じのサービス作ってます CRMツール 決済基盤 ・エクセルなど複数のシステムに分散  している卒業生・寄付者名簿を  名寄せ・統合して管理 ・名簿情報をさまざまな項目で簡単に  フィルタリングして抽出 ・HTMLメールをパソコン画面上で  簡単に作成し、名簿から配信可能

    ・配信したメールの到達率、開封率など  の分析機能も標準で提供 ・寄付決済、会費決済向けの様々な  決済手段をワンストップで提供 ・決済情報は名簿情報と自動的に連携 大学支援者・関係者の名寄せ〜名簿管理 寄付マーケティングに必要なツール群 寄付者のデータが名簿に 自動連携される決済ツール コミュニティ ・卒業生検索・キャリアサービスなど  在校生や卒業生への便益提供が可能 ・名簿情報と自動連携されており、  最新の個人情報に更新できる 在校生・卒業生ネットワークの アクティベーション
  2. 対策: Updatesを使う場合はmapかSelectを使って書く必要がある! gormアンチパターン type Organization struct { Name string StartYear

    int } db.Model(&Organization{}). Where("id = ?", oid). Updates(map[string]interface{}{ "name": "ほげ", "start_year": 0, })
  3. 対策: Updatesを使う場合はmapかSelectを使って書く必要がある! gormアンチパターン type Organization struct { Name string StartYear

    int } db.Select("name", "start_year"). Where("id = ?", oid). Updates(Organization{ Name: "ほげ", StartYear: 0, })
  4. 以下のソースコードの問題はなんだろう? 前提: 以下に該当するレコードが1件インサート済み gormアンチパターン type Organization struct { ID uuid.UUID

    Name string StartYear int } o := Organization{ ID: oid, Name: "ほげ", } if o.ID == uuid.Nil { // エラー処理 } db.Save(&o)
  5. 答え: Updatesメソッドと違ってSaveメソッドは渡されなかったものはゼロ値で更新される gormアンチパターン type Organization struct { ID uuid.UUID Name

    string StartYear int } o := Organization{ ID: oid, Name: "ほげ", } if o.ID == uuid.Nil { // エラー処理 } db.Save(&o)
  6. APIで出力したい形 { data: [ { ids: [“1”, “2”, “3”], //

    imported_user_diffsテーブルのid(後で使うから一応渡しておく data: [ // 似ているユーザの一塊を配列にしたもの {id: “A”(ユーザの情報も一緒に返す)}, {id: “B”(ユーザの情報も一緒に返す)}, {id: “C”(ユーザの情報も一緒に返す)}, {id: “D”(ユーザの情報も一緒に返す)}, ], }, { ids: [“4”], data: [ {id: “E”(ユーザの情報も一緒に返す)}, {id: “F”(ユーザの情報も一緒に返す)}, ], }, ], total: 2, } SQLアンチパターン
  7. 今回Alumnoteではこんな感じに対応しました - original_user_idの値を木構造で言う1つ上のノードの値ではなくて、親の値を持つようにした - 閉包テーブルに近い設計にした - imported_user_id = original_user_idの値は持たなかった -

    本来閉包テーブルにはimported_user_id = original_user_idの値を含めるが、もしユー ザを追加したときにimported_user_diffsテーブルにimported_user_id = original_user_idの値を追加するの忘れるとデータがおかしくなる - なくても表現できたのでimported_user_id = original_user_idの値はない方向にした SQLアンチパターン