Slide 1

Slide 1 text

ZOZOのデータカタログ内製事例と、
 データカタログを整え続けるための仕組みづくりについて
 2022年10月19日 Data Engineering Study #16「データカタログ特集回」
 株式会社ZOZO
 ZOZOTOWN開発本部 ZOZOTOWNWEB部 バックエンド1ブロック
 
 山本 健太 Copyright © ZOZO, Inc. 1

Slide 2

Slide 2 text

© ZOZO, Inc. 株式会社ZOZO
 ZOZOTOWN開発本部 ZOZOTOWNWEB部
 バックエンド1ブロック 山本 健太
 2020年4月に新卒で入社
 ZOZOTOWNのWEBバックエンド、マイクロサービスAPIなど の保守運用・開発をするチームに所属
 最近はウェブサイトのリプレイスなどを担当しています
 2

Slide 3

Slide 3 text

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


Slide 4

Slide 4 text

© ZOZO, Inc. https://wear.jp/
 4 ● ファッションコーディネートアプリ
 ● 1,600万ダウンロード突破、コーディネート投稿総数は1,300万件以上 (2022年6月末時点)
 ● ピックアップタグから最新のトレンドをチェック
 ● コーディネート着用アイテムを公式サイトで購入可能
 ● WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレント・デザ イナー・インフルエンサーといった各界著名人も参加


Slide 5

Slide 5 text

© ZOZO, Inc. 5 https://zozo.jp/zozoglass/
 ● 自宅で簡単・高精度にご自身の顔の肌の色を計測できる フェイスカラー計測ツール
 ● ECにおけるコスメ購入時の課題であった「色選び」に関する 不安や悩みを解消
 ● 肌の色を構成する成分、ヘモグロビン量とメラニン量を画像 から推定
 ● コスメ専門モール「ZOZOCOSME」で取り扱うベースメイクの 一部に対応
 ● 計測者数110万人を突破(2022年1月末時点)


Slide 6

Slide 6 text

© ZOZO, Inc. 6 今日の話は、
 ZOZOで導入(内製)したデータカタログについてです!


Slide 7

Slide 7 text

© ZOZO, Inc. 7 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3. システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次


Slide 8

Slide 8 text

© ZOZO, Inc. 8 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3. システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次


Slide 9

Slide 9 text

© ZOZO, Inc. 前提
 9 今回作成したデータカタログは、Microsoft SQL Server 用のものです
 SQL Server特有の話が出た場合は、注釈で補足します
 


Slide 10

Slide 10 text

© ZOZO, Inc. 10 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3. システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次


Slide 11

Slide 11 text

© ZOZO, Inc. 背景
 11 データカタログ導入以前
 テーブル定義書、ER図を手動更新で管理していた
 
 発生していた問題
 更新が放置され、信頼度の低い資料となっていた
 手動で入力できる情報量にも限界があるので、資料化できていない項目が多かっ た
 


Slide 12

Slide 12 text

© ZOZO, Inc. 背景
 12 データカタログ導入以前
 テーブル定義書、ER図を手動更新で管理していた
 
 発生していた問題
 更新が放置され、信頼度の低い資料となっていた
 手動で入力できる情報量にも限界があるので、資料化できていない項目が多かっ た
 
 情報の更新を自動化し、問題を解決しよう! (よくある導入動機かと思います)

Slide 13

Slide 13 text

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


Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

© ZOZO, Inc. 解決すべき課題
 16 ● テーブル定義書・ER図の情報が古い
 ● テーブル同士の繋がりが複雑で不明瞭
 ● テーブル数が膨大なためER図の出力形式を工夫したい
 ZOZOのDBには、外部キー制約は貼られていないがリレーションを持って いるものとして運用されているテーブルが大量にあった →この関係を特定してくれるツールがなかなか無い...

Slide 17

Slide 17 text

© ZOZO, Inc. つまり...
 17 親子関係を持つ2つのテーブルがあった際に


Slide 18

Slide 18 text

© ZOZO, Inc. 18 外部キー(FK)が登録されていれば簡単に親子関係を
 特定できるが、
 つまり...


Slide 19

Slide 19 text

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


Slide 20

Slide 20 text

© ZOZO, Inc. それをやるためには...
 20 このような推定が必要
 ● リレーションを持つテーブルのペアを推定
 ● どちらが親でどちらが子かを推定
 
 欲を言うとこれも推定したい
 ● 1:1なのか、 1:N なのかを推定
 ● 0可なのか、必ず1レコード以上紐づくのかを推定


Slide 21

Slide 21 text

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


Slide 22

Slide 22 text

© ZOZO, Inc. 解決すべき課題
 22 ● テーブル定義書・ER図の情報が古い
 ● テーブル同士の繋がりが複雑で不明瞭
 ● テーブル数が膨大なためER図の出力形式を工夫したい
 ○ 文字列検索やURL共有ができるよう、HTMLで出力できると良いのでは?
 ○ 大量なテーブル数描画にも耐えられると嬉しい


Slide 23

Slide 23 text

© ZOZO, Inc. 解決すべき課題
 23 ● テーブル定義書・ER図の情報が古い
 ● テーブル同士の繋がりが複雑で不明瞭
 ● テーブル数が膨大なためER図の出力形式を工夫したい
 ○ 文字列検索やURL共有ができるよう、HTMLで出力できると良いのでは?
 ○ 大量なテーブル数描画にも耐えられると嬉しい
 ER図単体で見れば既存ツールで解決可能かもしれないが 色々考慮すると内製するのが早そう!

Slide 24

Slide 24 text

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


Slide 25

Slide 25 text

© ZOZO, Inc. 25 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3. システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次


Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

© ZOZO, Inc. 28 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3. システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次


Slide 29

Slide 29 text

© ZOZO, Inc. 29 DEMO
 ※テーブル名、カラム名など、機密情報はすべてマスクしてあります


Slide 30

Slide 30 text

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


Slide 31

Slide 31 text

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


Slide 32

Slide 32 text

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


Slide 33

Slide 33 text

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


Slide 34

Slide 34 text

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


Slide 35

Slide 35 text

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


Slide 36

Slide 36 text

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


Slide 37

Slide 37 text

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


Slide 38

Slide 38 text

© ZOZO, Inc. 38 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3. システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次


Slide 39

Slide 39 text

© ZOZO, Inc. 39 推定方法
 本番アプリケーションや本番バッチなどで実行されているSQLクエリを解析して推定
 
 
 ロジック紹介 - リレーションを持つテーブルのペアを推定


Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

© ZOZO, Inc. 41 例えばこのようなクエリがあったとき
 ロジック紹介 - リレーションを持つテーブルのペアを推定
 SELECT * FROM Goods JOIN Category ON Goods.CategoryID = Category.ID JOINで結ばれているカラムがあればペアの候補とし、 2つのカラムのうちどちらか、もしくは両方がPKであればリレーションを持つものとして登録する (仮想的な外部キー制約を登録する)

Slide 42

Slide 42 text

© ZOZO, Inc. 42 ロジック紹介 - 0可なのか、必ず1レコード以上紐づくのかを推定
 推定方法
 本番環境DBに対して解析用のSQLクエリを実行し、結果で推定
 ER図上の表記
 0可の場合の記号
 1レコード以上紐づく場合の記号
 
 


Slide 43

Slide 43 text

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


Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

© ZOZO, Inc. 47 ロジック紹介 - 1:1 or 1:N を推定
 推定方法
 本番環境DBに対して解析用のSQLクエリを実行し、結果で推定
 ER図上の表記
 1:1の場合の記号
 1:Nの場合の記号
 
 


Slide 48

Slide 48 text

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


Slide 49

Slide 49 text

© 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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

© ZOZO, Inc. 52 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3. システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次


Slide 53

Slide 53 text

© ZOZO, Inc. 53 ● レプリケーション情報、テーブル定義の確認
 ● 今まで資料化が難しかったリレーション情報の確認
 ● 情報共有の際、関連テーブルでER図を作成して共有
 
 
 
 どう活用されているか


Slide 54

Slide 54 text

© ZOZO, Inc. 54 プロジェクトの概要
 1. 前提
 2. 背景と、既存ツールを利用せずに内製した理由
 3. システムとプロジェクトの概要
 システム説明
 1. DEMO
 2. ロジック紹介
 3. どう活用されているか
 作ったあとの話
 1. データカタログを整え続けるための仕組み作り
 目次


Slide 55

Slide 55 text

© ZOZO, Inc. 55 テーブル作成時のルール
 ● descriptionの入力必須化
 ● 外部キー制約登録を推奨
 ● コード値を持つカラムは、descriptionに「【コード値】」と入力する
 データカタログを整え続けるための仕組み作り


Slide 56

Slide 56 text

© ZOZO, Inc. 56 最後に


Slide 57

Slide 57 text

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


Slide 58

Slide 58 text

No content