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

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のデータカタログ内製事例と、

    データカタログを整え続けるための仕組みづくりについて

    2022年10月19日 Data Engineering Study #16「データカタログ特集回」

    株式会社ZOZO

    ZOZOTOWN開発本部 ZOZOTOWNWEB部 バックエンド1ブロック


    山本 健太
    Copyright © ZOZO, Inc.
    1

    View full-size slide

  2. © ZOZO, Inc.
    株式会社ZOZO

    ZOZOTOWN開発本部 ZOZOTOWNWEB部

    バックエンド1ブロック
    山本 健太

    2020年4月に新卒で入社

    ZOZOTOWNのWEBバックエンド、マイクロサービスAPIなど
    の保守運用・開発をするチームに所属

    最近はウェブサイトのリプレイスなどを担当しています

    2

    View full-size slide

  3. © ZOZO, Inc.
    https://zozo.jp/

    3
    ● ファッションEC

    ● 1,500以上のショップ、8,500以上のブランドの取り扱い

    ● 常時90万点以上の商品アイテム数と毎日平均2,600点以上の新着 商
    品を掲載(2022年6月末時点)

    ● ブランド古着のファッションゾーン「ZOZOUSED」や

    コスメ専門モール「ZOZOCOSME」、靴の専門モール

    「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン

    「ZOZOVILLA」を展開

    ● 即日配送サービス

    ● ギフトラッピングサービス

    ● ツケ払い など


    View full-size slide

  4. © ZOZO, Inc.
    https://wear.jp/

    4
    ● ファッションコーディネートアプリ

    ● 1,600万ダウンロード突破、コーディネート投稿総数は1,300万件以上
    (2022年6月末時点)

    ● ピックアップタグから最新のトレンドをチェック

    ● コーディネート着用アイテムを公式サイトで購入可能

    ● WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレント・デザ
    イナー・インフルエンサーといった各界著名人も参加


    View full-size slide

  5. © ZOZO, Inc.
    5
    https://zozo.jp/zozoglass/

    ● 自宅で簡単・高精度にご自身の顔の肌の色を計測できる
    フェイスカラー計測ツール

    ● ECにおけるコスメ購入時の課題であった「色選び」に関する
    不安や悩みを解消

    ● 肌の色を構成する成分、ヘモグロビン量とメラニン量を画像
    から推定

    ● コスメ専門モール「ZOZOCOSME」で取り扱うベースメイクの
    一部に対応

    ● 計測者数110万人を突破(2022年1月末時点)


    View full-size slide

  6. © ZOZO, Inc.
    6
    今日の話は、

    ZOZOで導入(内製)したデータカタログについてです!


    View full-size slide

  7. © ZOZO, Inc.
    7
    プロジェクトの概要

    1. 前提

    2. 背景と、既存ツールを利用せずに内製した理由

    3. システムとプロジェクトの概要

    システム説明

    1. DEMO

    2. ロジック紹介

    3. どう活用されているか

    作ったあとの話

    1. データカタログを整え続けるための仕組み作り

    目次


    View full-size slide

  8. © ZOZO, Inc.
    8
    プロジェクトの概要

    1. 前提

    2. 背景と、既存ツールを利用せずに内製した理由

    3. システムとプロジェクトの概要

    システム説明

    1. DEMO

    2. ロジック紹介

    3. どう活用されているか

    作ったあとの話

    1. データカタログを整え続けるための仕組み作り

    目次


    View full-size slide

  9. © ZOZO, Inc.
    前提

    9
    今回作成したデータカタログは、Microsoft SQL Server 用のものです

    SQL Server特有の話が出た場合は、注釈で補足します


    View full-size slide

  10. © ZOZO, Inc.
    10
    プロジェクトの概要

    1. 前提

    2. 背景と、既存ツールを利用せずに内製した理由

    3. システムとプロジェクトの概要

    システム説明

    1. DEMO

    2. ロジック紹介

    3. どう活用されているか

    作ったあとの話

    1. データカタログを整え続けるための仕組み作り

    目次


    View full-size slide

  11. © ZOZO, Inc.
    背景

    11
    データカタログ導入以前

    テーブル定義書、ER図を手動更新で管理していた


    発生していた問題

    更新が放置され、信頼度の低い資料となっていた

    手動で入力できる情報量にも限界があるので、資料化できていない項目が多かっ
    た


    View full-size slide

  12. © ZOZO, Inc.
    背景

    12
    データカタログ導入以前

    テーブル定義書、ER図を手動更新で管理していた


    発生していた問題

    更新が放置され、信頼度の低い資料となっていた

    手動で入力できる情報量にも限界があるので、資料化できていない項目が多かっ
    た


    情報の更新を自動化し、問題を解決しよう!
    (よくある導入動機かと思います)

    View full-size slide

  13. © ZOZO, Inc.
    解決すべき課題

    13
    ● テーブル定義書・ER図の情報が古い

    ● テーブル同士の繋がりが複雑で不明瞭

    ● テーブル数が膨大なためER図の出力形式を工夫したい


    View full-size slide

  14. © ZOZO, Inc.
    解決すべき課題

    14
    ● テーブル定義書・ER図の情報が古い

    ● テーブル同士の繋がりが複雑で不明瞭

    ● テーブル数が膨大なためER図の出力形式を工夫したい

    既存ツールで解決可能

    View full-size slide

  15. © ZOZO, Inc.
    解決すべき課題

    15
    ● テーブル定義書・ER図の情報が古い

    ● テーブル同士の繋がりが複雑で不明瞭

    ● テーブル数が膨大なためER図の出力形式を工夫したい

    外部キー制約が貼られていれば
    既存ツールで解決可能

    View full-size slide

  16. © ZOZO, Inc.
    解決すべき課題

    16
    ● テーブル定義書・ER図の情報が古い

    ● テーブル同士の繋がりが複雑で不明瞭

    ● テーブル数が膨大なためER図の出力形式を工夫したい

    ZOZOのDBには、外部キー制約は貼られていないがリレーションを持って
    いるものとして運用されているテーブルが大量にあった
    →この関係を特定してくれるツールがなかなか無い...

    View full-size slide

  17. © ZOZO, Inc.
    つまり...

    17
    親子関係を持つ2つのテーブルがあった際に


    View full-size slide

  18. © ZOZO, Inc.
    18
    外部キー(FK)が登録されていれば簡単に親子関係を

    特定できるが、

    つまり...


    View full-size slide

  19. © ZOZO, Inc.
    つまり...

    19
    外部キーを貼らずに、親子関係を持っているものとして運用されている
    テーブルに関しては特定できない


    View full-size slide

  20. © ZOZO, Inc.
    それをやるためには...

    20
    このような推定が必要

    ● リレーションを持つテーブルのペアを推定

    ● どちらが親でどちらが子かを推定


    欲を言うとこれも推定したい

    ● 1:1なのか、 1:N なのかを推定

    ● 0可なのか、必ず1レコード以上紐づくのかを推定


    View full-size slide

  21. © ZOZO, Inc.
    解決すべき課題

    21
    ● テーブル定義書・ER図の情報が古い

    ● テーブル同士の繋がりが複雑で不明瞭

    ● テーブル数が膨大なためER図の出力形式を工夫したい


    View full-size slide

  22. © ZOZO, Inc.
    解決すべき課題

    22
    ● テーブル定義書・ER図の情報が古い

    ● テーブル同士の繋がりが複雑で不明瞭

    ● テーブル数が膨大なためER図の出力形式を工夫したい

    ○ 文字列検索やURL共有ができるよう、HTMLで出力できると良いのでは?

    ○ 大量なテーブル数描画にも耐えられると嬉しい


    View full-size slide

  23. © ZOZO, Inc.
    解決すべき課題

    23
    ● テーブル定義書・ER図の情報が古い

    ● テーブル同士の繋がりが複雑で不明瞭

    ● テーブル数が膨大なためER図の出力形式を工夫したい

    ○ 文字列検索やURL共有ができるよう、HTMLで出力できると良いのでは?

    ○ 大量なテーブル数描画にも耐えられると嬉しい

    ER図単体で見れば既存ツールで解決可能かもしれないが
    色々考慮すると内製するのが早そう!

    View full-size slide

  24. © ZOZO, Inc.
    プロジェクトのタイムライン

    24
    2020年08月

    2020年11月

    2021年02月

    2021年07月

    2021年09月

    - 個人的にプロトタイプを作成し、チームリーダーに共有

    - DBテックリードやCTOのフィードバックを得て、プロジェクト化

    - 推定ロジックの実装が完了し、β版を社内公開

    - 完成版を社内公開

    - descriptionの入力など、人力作業が不可欠な部分を各チームに入力し
    てもらう / DB周りの実装ルールを整備する



    View full-size slide

  25. © ZOZO, Inc.
    25
    プロジェクトの概要

    1. 前提

    2. 背景と、既存ツールを利用せずに内製した理由

    3. システムとプロジェクトの概要

    システム説明

    1. DEMO

    2. ロジック紹介

    3. どう活用されているか

    作ったあとの話

    1. データカタログを整え続けるための仕組み作り

    目次


    View full-size slide

  26. © ZOZO, Inc.
    26
    データを閲覧する人
    データのメタ情報を追加する人
    ER図を閲覧・作成する人
    データカタログ、ER図を描画するウェ
    ブサイト
    システム概要

    推定ロジックなどを持つ定期実行バッチ

    View full-size slide

  27. © ZOZO, Inc.
    27
    データを閲覧する人
    データのメタ情報を追加する人
    ER図を閲覧・作成する人
    データカタログ、ER図を描画するウェ
    ブサイト
    →DEMO動画で紹介します!
    推定ロジックなどを持つ定期実行バッチ
    →後ほどロジックを紹介します!
    システム概要

    テーブル・カラムの情報
    メタデータを取得する
    クエリを実行
    DBから取得した情報を POST

    View full-size slide

  28. © ZOZO, Inc.
    28
    プロジェクトの概要

    1. 前提

    2. 背景と、既存ツールを利用せずに内製した理由

    3. システムとプロジェクトの概要

    システム説明

    1. DEMO

    2. ロジック紹介

    3. どう活用されているか

    作ったあとの話

    1. データカタログを整え続けるための仕組み作り

    目次


    View full-size slide

  29. © ZOZO, Inc.
    29
    DEMO

    ※テーブル名、カラム名など、機密情報はすべてマスクしてあります


    View full-size slide

  30. © ZOZO, Inc.
    30
    DEMO(スクリーンショット) - TOPページ


    View full-size slide

  31. © ZOZO, Inc.
    31
    DEMO(スクリーンショット) - データベース選択ページ


    View full-size slide

  32. © ZOZO, Inc.
    32
    DEMO(スクリーンショット) - テーブル定義書


    View full-size slide

  33. © ZOZO, Inc.
    33
    DEMO(スクリーンショット) - テーブル定義書


    View full-size slide

  34. © ZOZO, Inc.
    34
    DEMO(スクリーンショット) - カラム詳細


    View full-size slide

  35. © ZOZO, Inc.
    35
    DEMO(スクリーンショット) - ER図選択ページ


    View full-size slide

  36. © ZOZO, Inc.
    36
    DEMO(スクリーンショット) - ER図詳細ページ


    View full-size slide

  37. © ZOZO, Inc.
    37
    DEMO(スクリーンショット) - ER図作成ページ


    View full-size slide

  38. © ZOZO, Inc.
    38
    プロジェクトの概要

    1. 前提

    2. 背景と、既存ツールを利用せずに内製した理由

    3. システムとプロジェクトの概要

    システム説明

    1. DEMO

    2. ロジック紹介

    3. どう活用されているか

    作ったあとの話

    1. データカタログを整え続けるための仕組み作り

    目次


    View full-size slide

  39. © ZOZO, Inc.
    39
    推定方法

    本番アプリケーションや本番バッチなどで実行されているSQLクエリを解析して推定



    ロジック紹介 - リレーションを持つテーブルのペアを推定


    View full-size slide

  40. © ZOZO, Inc.
    40
    例えばこのようなクエリがあったとき

    ロジック紹介 - リレーションを持つテーブルのペアを推定

    SELECT
    *
    FROM
    Goods
    JOIN
    Category
    ON
    Goods.CategoryID = Category.ID

    View full-size slide

  41. © ZOZO, Inc.
    41
    例えばこのようなクエリがあったとき

    ロジック紹介 - リレーションを持つテーブルのペアを推定

    SELECT
    *
    FROM
    Goods
    JOIN
    Category
    ON
    Goods.CategoryID = Category.ID
    JOINで結ばれているカラムがあればペアの候補とし、
    2つのカラムのうちどちらか、もしくは両方がPKであればリレーションを持つものとして登録する
    (仮想的な外部キー制約を登録する)

    View full-size slide

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

    推定方法

    本番環境DBに対して解析用のSQLクエリを実行し、結果で推定

    ER図上の表記

    0可の場合の記号

    1レコード以上紐づく場合の記号



    View full-size slide

  43. © 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件以上紐づくのか否かを推定する


    View full-size slide

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

    SELECT DISTINCT TOP 1 Category.ID
    FROM Category
    WHERE NOT EXISTS(
    SELECT *
    FROM Goods
    WHERE Category.ID = Goods.CategoryID
    )
    例えばこのようなデータに対してクエリを実行すると...

    View full-size slide

  45. © 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件の場合もある

    View full-size slide

  46. © 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件以上紐づくという断定はできない

    View full-size slide

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

    推定方法

    本番環境DBに対して解析用のSQLクエリを実行し、結果で推定

    ER図上の表記

    1:1の場合の記号

    1:Nの場合の記号



    View full-size slide

  48. © 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(の可能性あり)


    View full-size slide

  49. © 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

    View full-size slide

  50. © 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件となる

    View full-size slide

  51. © 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件となる

    View full-size slide

  52. © ZOZO, Inc.
    52
    プロジェクトの概要

    1. 前提

    2. 背景と、既存ツールを利用せずに内製した理由

    3. システムとプロジェクトの概要

    システム説明

    1. DEMO

    2. ロジック紹介

    3. どう活用されているか

    作ったあとの話

    1. データカタログを整え続けるための仕組み作り

    目次


    View full-size slide

  53. © ZOZO, Inc.
    53
    ● レプリケーション情報、テーブル定義の確認

    ● 今まで資料化が難しかったリレーション情報の確認

    ● 情報共有の際、関連テーブルでER図を作成して共有




    どう活用されているか


    View full-size slide

  54. © ZOZO, Inc.
    54
    プロジェクトの概要

    1. 前提

    2. 背景と、既存ツールを利用せずに内製した理由

    3. システムとプロジェクトの概要

    システム説明

    1. DEMO

    2. ロジック紹介

    3. どう活用されているか

    作ったあとの話

    1. データカタログを整え続けるための仕組み作り

    目次


    View full-size slide

  55. © ZOZO, Inc.
    55
    テーブル作成時のルール

    ● descriptionの入力必須化

    ● 外部キー制約登録を推奨

    ● コード値を持つカラムは、descriptionに「【コード値】」と入力する

    データカタログを整え続けるための仕組み作り


    View full-size slide

  56. © ZOZO, Inc.
    56
    最後に


    View full-size slide

  57. © ZOZO, Inc.
    57
    ZOZOTOWN バックエンドエンジニア(マイクロサービス)
    https://hrmos.co/pages/zozotech/jobs/0000005
    バックエンドエンジニア(オープンポジション)
    https://hrmos.co/pages/zozotech/jobs/0000166
    採用情報


    View full-size slide