Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

ZOZOのデータカタログ内製事例と、 データカタログを整え続けるための仕組みづくりについて

ZOZOのデータカタログ内製事例と、 データカタログを整え続けるための仕組みづくりについて

Data Engineering Study #16「データカタログ入門」 にて登壇した内容

イベントリンク:https://forkwell.connpass.com/event/255166/
アーカイブ:https://www.youtube.com/watch?v=1tBNmP7UY8w&list=PL-zOB4NIHubaG_W63xg0dJCfm3C6GJEIz&index=15&t=48s

kenta yamamoto

October 20, 2022
Tweet

More Decks by kenta yamamoto

Other Decks in Technology

Transcript

  1. © ZOZO, Inc. 株式会社ZOZO
 ZOZOTOWN開発本部 ZOZOTOWNWEB部
 バックエンド1ブロック 山本 健太
 2020年4月に新卒で入社


    ZOZOTOWNのWEBバックエンド、マイクロサービスAPIなど の保守運用・開発をするチームに所属
 最近はウェブサイトのリプレイスなどを担当しています
 2
  2. © ZOZO, Inc. https://zozo.jp/
 3 • ファッションEC
 • 1,500以上のショップ、8,500以上のブランドの取り扱い
 •

    常時90万点以上の商品アイテム数と毎日平均2,600点以上の新着 商 品を掲載(2022年6月末時点)
 • ブランド古着のファッションゾーン「ZOZOUSED」や
 コスメ専門モール「ZOZOCOSME」、靴の専門モール
 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン
 「ZOZOVILLA」を展開
 • 即日配送サービス
 • ギフトラッピングサービス
 • ツケ払い など

  3. © ZOZO, Inc. https://wear.jp/
 4 • ファッションコーディネートアプリ
 • 1,600万ダウンロード突破、コーディネート投稿総数は1,300万件以上 (2022年6月末時点)


    • ピックアップタグから最新のトレンドをチェック
 • コーディネート着用アイテムを公式サイトで購入可能
 • WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレント・デザ イナー・インフルエンサーといった各界著名人も参加

  4. © ZOZO, Inc. 5 https://zozo.jp/zozoglass/
 • 自宅で簡単・高精度にご自身の顔の肌の色を計測できる フェイスカラー計測ツール
 • ECにおけるコスメ購入時の課題であった「色選び」に関する

    不安や悩みを解消
 • 肌の色を構成する成分、ヘモグロビン量とメラニン量を画像 から推定
 • コスメ専門モール「ZOZOCOSME」で取り扱うベースメイクの 一部に対応
 • 計測者数110万人を突破(2022年1月末時点)

  5. © ZOZO, Inc. 7 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3.

    システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次

  6. © ZOZO, Inc. 8 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3.

    システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次

  7. © ZOZO, Inc. 10 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3.

    システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次

  8. © ZOZO, Inc. 背景
 12 データカタログ導入以前
 テーブル定義書、ER図を手動更新で管理していた
 
 発生していた問題
 更新が放置され、信頼度の低い資料となっていた


    手動で入力できる情報量にも限界があるので、資料化できていない項目が多かっ た
 
 情報の更新を自動化し、問題を解決しよう! (よくある導入動機かと思います)
  9. © ZOZO, Inc. 解決すべき課題
 14 • テーブル定義書・ER図の情報が古い
 • テーブル同士の繋がりが複雑で不明瞭
 •

    テーブル数が膨大なためER図の出力形式を工夫したい
 既存ツールで解決可能
  10. © ZOZO, Inc. 解決すべき課題
 15 • テーブル定義書・ER図の情報が古い
 • テーブル同士の繋がりが複雑で不明瞭
 •

    テーブル数が膨大なためER図の出力形式を工夫したい
 外部キー制約が貼られていれば 既存ツールで解決可能
  11. © ZOZO, Inc. 解決すべき課題
 16 • テーブル定義書・ER図の情報が古い
 • テーブル同士の繋がりが複雑で不明瞭
 •

    テーブル数が膨大なためER図の出力形式を工夫したい
 ZOZOのDBには、外部キー制約は貼られていないがリレーションを持って いるものとして運用されているテーブルが大量にあった →この関係を特定してくれるツールがなかなか無い...
  12. © ZOZO, Inc. それをやるためには...
 20 このような推定が必要
 • リレーションを持つテーブルのペアを推定
 • どちらが親でどちらが子かを推定


    
 欲を言うとこれも推定したい
 • 1:1なのか、 1:N なのかを推定
 • 0可なのか、必ず1レコード以上紐づくのかを推定

  13. © ZOZO, Inc. 解決すべき課題
 22 • テーブル定義書・ER図の情報が古い
 • テーブル同士の繋がりが複雑で不明瞭
 •

    テーブル数が膨大なためER図の出力形式を工夫したい
 ◦ 文字列検索やURL共有ができるよう、HTMLで出力できると良いのでは?
 ◦ 大量なテーブル数描画にも耐えられると嬉しい

  14. © ZOZO, Inc. 解決すべき課題
 23 • テーブル定義書・ER図の情報が古い
 • テーブル同士の繋がりが複雑で不明瞭
 •

    テーブル数が膨大なためER図の出力形式を工夫したい
 ◦ 文字列検索やURL共有ができるよう、HTMLで出力できると良いのでは?
 ◦ 大量なテーブル数描画にも耐えられると嬉しい
 ER図単体で見れば既存ツールで解決可能かもしれないが 色々考慮すると内製するのが早そう!
  15. © ZOZO, Inc. プロジェクトのタイムライン
 24 2020年08月
 2020年11月
 2021年02月
 2021年07月
 2021年09月


    - 個人的にプロトタイプを作成し、チームリーダーに共有
 - DBテックリードやCTOのフィードバックを得て、プロジェクト化
 - 推定ロジックの実装が完了し、β版を社内公開
 - 完成版を社内公開
 - descriptionの入力など、人力作業が不可欠な部分を各チームに入力し てもらう / DB周りの実装ルールを整備する
 
 

  16. © ZOZO, Inc. 25 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3.

    システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次

  17. © ZOZO, Inc. 27 データを閲覧する人 データのメタ情報を追加する人 ER図を閲覧・作成する人 データカタログ、ER図を描画するウェ ブサイト →DEMO動画で紹介します!

    推定ロジックなどを持つ定期実行バッチ →後ほどロジックを紹介します! システム概要
 テーブル・カラムの情報 メタデータを取得する クエリを実行 DBから取得した情報を POST
  18. © ZOZO, Inc. 28 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3.

    システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次

  19. © ZOZO, Inc. 38 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3.

    システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次

  20. © ZOZO, Inc. 41 例えばこのようなクエリがあったとき
 ロジック紹介 - リレーションを持つテーブルのペアを推定
 SELECT *

    FROM Goods JOIN Category ON Goods.CategoryID = Category.ID JOINで結ばれているカラムがあればペアの候補とし、 2つのカラムのうちどちらか、もしくは両方がPKであればリレーションを持つものとして登録する (仮想的な外部キー制約を登録する)
  21. © ZOZO, Inc. 43 ロジック紹介 - 0可なのか、必ず1レコード以上紐づくのかを推定
 SELECT DISTINCT TOP

    1 @Column1 FROM @Table1 WHERE NOT EXISTS( SELECT * FROM @Table2 WHERE @Column1 = @Column2 ) ※SQL Serverの文法です ※TOP句は取得件数のlimitを指定する構文 結果が返ってきたら Table2はTable1に1件以上紐づく
 なければTable2はTable1に対して0件の可能性あり
 Table1に対して、Table2は必ず1件以上紐づくのか否かを推定する

  22. © ZOZO, Inc. 44 ロジック紹介 - 0可なのか、必ず1レコード以上紐づくのかを推定
 SELECT DISTINCT TOP

    1 Category.ID FROM Category WHERE NOT EXISTS( SELECT * FROM Goods WHERE Category.ID = Goods.CategoryID ) 例えばこのようなデータに対してクエリを実行すると...
  23. © ZOZO, Inc. 45 ロジック紹介 - 0可なのか、必ず1レコード以上紐づくのかを推定
 SELECT DISTINCT TOP

    1 Category.ID FROM Category WHERE NOT EXISTS( SELECT * FROM Goods WHERE Category.ID = Goods.CategoryID ) 例えばこのようなデータに対してクエリを実行すると... 「シューズ」に紐づくGoodsが無いのでNOT EXISTSに引っかかり、クエリ結果が1行返却される → Categoryに対してGoodsは、0件の場合もある
  24. © ZOZO, Inc. 46 ロジック紹介 - 0可なのか、必ず1レコード以上紐づくのかを推定
 SELECT DISTINCT TOP

    1 Category.ID FROM Category WHERE NOT EXISTS( SELECT * FROM Goods WHERE Category.ID = Goods.CategoryID ) 例えばこのようなデータに対してクエリを実行すると... 逆に、「シューズ」に紐づくGoodsが存在していればクエリ結果は0行となる → Categoryに対してGoodsは、1件以上紐づく ※その時点で1件以上紐付いていたというだけなので、今後もずっと必ず1件以上紐づくという断定はできない
  25. © ZOZO, Inc. 47 ロジック紹介 - 1:1 or 1:N を推定


    推定方法
 本番環境DBに対して解析用のSQLクエリを実行し、結果で推定
 ER図上の表記
 1:1の場合の記号
 1:Nの場合の記号
 
 

  26. © ZOZO, Inc. 48 ロジック紹介 - 1:1 or 1:N を推定


    SELECT DISTINCT TOP 1 @Column1 FROM @Table1 WHERE EXISTS( SELECT @Column2 FROM @Table2 WHERE @Column1 = @Column2 GROUP BY @Column2 HAVING COUNT(*) > 1 ) AND @Column1 IS NOT NULL ※SQL Serverの文法です ※TOP句は取得件数のlimitを指定する構文 結果が返ってきたら Table1 : Table2 = 1 : N
 なければ Table1 : Table2 = 1 : 1(の可能性あり)

  27. © ZOZO, Inc. 49 ロジック紹介 - 1:1 or 1:N を推定


    例えばこのようなデータに対してクエリを実行すると...
 SELECT DISTINCT TOP 1 Category.ID FROM Category WHERE EXISTS( SELECT Goods.CategoryID FROM Goods WHERE Category.ID = Goods.CategoryID GROUP BY Goods.CategoryID HAVING COUNT(*) > 1 ) AND Category.ID IS NOT NULL
  28. © ZOZO, Inc. 50 ロジック紹介 - 1:1 or 1:N を推定


    例えばこのようなデータに対してクエリを実行すると...
 SELECT DISTINCT TOP 1 Category.ID FROM Category WHERE EXISTS( SELECT Goods.CategoryID FROM Goods WHERE Category.ID = Goods.CategoryID GROUP BY Goods.CategoryID HAVING COUNT(*) > 1 ) AND Category.ID IS NOT NULL EXISTSに引っかかる(Goodsを2個以上保有している)Categoryが無いため、結果は0件となる
  29. © ZOZO, Inc. 51 ロジック紹介 - 1:1 or 1:N を推定


    SELECT DISTINCT TOP 1 Category.ID FROM Category WHERE EXISTS( SELECT Goods.CategoryID FROM Goods WHERE Category.ID = Goods.CategoryID GROUP BY Goods.CategoryID HAVING COUNT(*) > 1 ) AND Category.ID IS NOT NULL パンツがEXISTSに引っかかる(Goodsを2個以上保有している)ため、結果は1件となる
  30. © ZOZO, Inc. 52 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3.

    システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次

  31. © ZOZO, Inc. 54 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3.

    システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次

  32. © ZOZO, Inc. 55 テーブル作成時のルール
 • descriptionの入力必須化
 • 外部キー制約登録を推奨
 •

    コード値を持つカラムは、descriptionに「【コード値】」と入力する
 データカタログを整え続けるための仕組み作り