【DeNA TechCon 2025】 DeNAがマスタデータ管理にOyakataを使う理由

11.5K Views

February 05, 25

スライド概要

近年のスマートフォンゲーム開発は大規模で長期にわたるうえ、リリースは高頻度に行われます。そのため、マスタデータのコンフリクトが多くの開発者の頭を悩ませてきました。なぜマスタデータはこんなにコンフリクトするのでしょうか。そこにはデータベースとバージョン管理システムの原理が深く関係していました。DeNA ではこの問題を解決するために、マスタデータ専用の内製バージョン管理ツールである「Oyakata」を導入しています。本セッションでは、Oyakata の導入まで DeNA で行ってきた Git や Google スプレッドシートによるマスタデータ管理と、Oyakata を使ったマスタデータ管理を比較し、マスタデータとバージョン管理システムの関係と、そこに潜む課題を解説していきます。

◆ チャンネル登録はこちら↓
https://www.youtube.com/c/denatech?sub_confirmation=1

◆ X(旧Twitter)
https://x.com/denaxtech

◆ DeNA Engineering
https://engineering.dena.com/

◆ DeNA Engineer Blog
https://engineering.dena.com/blog/

◆ DeNA × AI Day ‖ DeNA TechCon 2025 公式サイト
https://techcon2025.dena.dev/

profile-image

DeNA が社会の技術向上に貢献するため、業務で得た知見を積極的に外部に発信する、DeNA 公式のアカウントです。DeNA エンジニアの登壇資料をお届けします。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

DeNAが マスタデータ管理にOyakataを使う理由 ゲームサービス事業本部開発運営統括部 ⼭部 薫 / 成⽥ 裕司 1 © DeNA Co., Ltd.

2.

⼤規模‧並⾏開発を⽀えるマスタデータ技術 Oyakata マスタデータ専⽤バージョン管理ツール Muscle Runtime/Versionによって異なるスキーマを 1つに統合したスキーマで管理する 2 © DeNA Co., Ltd.

3.

⼤規模‧並⾏開発を⽀えるマスタデータ技術 Oyakata マスタデータ専⽤バージョン管理ツール Muscle なぜわざわざ専⽤ツールを開発する必要があったのか Runtime/Versionによって異なるスキーマを ⼤規模‧並⾏開発の背景から解説します 1つに統合したスキーマで管理する 3 © DeNA Co., Ltd.

4.

⾃⼰紹介Profile ⼭部 薫 2014年新卒⼊社 ブラウザゲームのサーバエンジニア‧アプリ ゲームのクライアントエンジニア‧開発会社の 技術サポート‧Oyakataの開発など幅広く活躍 4 © DeNA Co., Ltd.

5.

Outline 1. 2. 3. 4. 5. 6. 7. 8. 5 マスタデータとは DeNAマスタデータの歴史 Oyakata導⼊以前の課題点 Oyakataとは マスタデータに適したバージョン管理 データの安定性の取り組み Oyakataの開発フロー まとめ © DeNA Co., Ltd.

6.

マスタデータとは 6 © DeNA Co., Ltd.

7.

マスタデータとは マスターデータは、ビジネスエンティティ(従業員、顧客、製品、財務構 造、資産、場所など)に関するデータであり、業務トランザクションや業 務データ分析に意味を与える。エンティティは実世界のオブジェクト (⼈、組織、場所、物)である。エンティティはエンティティインスタン スによって具体化され、データ∕レコードの形式をとる。 DAMA International; DAMA ⽇本⽀部 Metafind コンサルティング株式会社. データマネジメント知識体系ガイド 第⼆版 改定新版 (p.691). ⽇経BP. Kindle 版. 7 © DeNA Co., Ltd.

8.

モバイルゲームにおけるマスタデータ Character Entity ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 データベース等に ⼊れることが多い Weapon キャラクターや武器など ID Name ATK Weight Type w1 Bronze Sword 300 120 Sword w2 Bronze Spear 400 200 Spear Database ゲームバランスなどを考慮した設定値 ゲームのエンティティに対して 意味を与えるような設定データ 8 © DeNA Co., Ltd.

9.

モバイルゲームにおけるマスタデータ Character Edit ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 Weapon ゲームデザイナー ID Name ATK Weight Type レベルデザイナー w1 Bronze Sword 300 120 Sword w2 Bronze Spear 400 200 Spear プランナー 表計算ソフトが使われることが多い マスタデータを⼊⼒することで遊びや難易度を調整する 9 © DeNA Co., Ltd.

10.

本講演におけるマスタデータの範囲 Character ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 Weapon 10 SpreadSheet Database 主に表計算ソフ トで⼊⼒される 主にDBで 管理される ID Name ATK Weight Type w1 Bronze Sword 300 120 Sword w2 Bronze Spear 400 200 Spear ゲームの設定データ © DeNA Co., Ltd.

11.

DeNAマスタデータの歴史 - Oyakata誕⽣前 - 11 © DeNA Co., Ltd.

12.

ブラウザゲーム時代 12 © DeNA Co., Ltd.

13.

ブラウザゲーム スマートフォン‧フィーチャーフォンの ブラウザ向けゲーム 13 © DeNA Co., Ltd.

14.

ブラウザゲーム時代 怪盗ロワイヤル: 2009年10⽉~ ⾔語 DB 14 © DeNA Co., Ltd.

15.

ブラウザゲーム時代 ⽉4回のイベントリリース エンジニア 15 3週⽬イベント 2週⽬イベント 1週⽬イベント プランナー エンジニア プランナー エンジニア 4週⽬イベント プランナー エンジニア プランナー © DeNA Co., Ltd.

16.

ブラウザゲーム時代 ⽉4回のイベントリリース 16 3週⽬イベント 1週⽬イベント 2週⽬イベント エンジニア イベントの開発は エンジニア エンジニア エンジニア プランナー プランナー エンジニアとプランナーがペアで担当 プランナー 4週⽬イベント プランナー © DeNA Co., Ltd.

17.

ブラウザゲーム - マスタデータ開発の流れ restore コピー&ペースト Excelで⼊⼒ プランナー 17 dump Opeツール MySQL ⼊⼒ dump 動作確認 commit commit CSV/TSV バージョン管理 エンジニア © DeNA Co., Ltd.

18.

ブラウザゲーム - マスタデータ開発の流れ restore コピー&ペースト Excelで⼊⼒ dump Opeツール MySQL commit CSV/TSV バージョン管理 ⼩規模でシンプルな開発フロー ⼊⼒ dump CSVファイルのコンフリクトは多発したが 動作確認 commit プランナー1⼈分のコンフリクトの解消は容易 プランナー 18 エンジニア © DeNA Co., Ltd.

19.

スマートフォンアプリゲーム 19 © DeNA Co., Ltd.

20.

スマートフォンアプリゲームの台頭 App 容量制限 Store クライアント アップデート 100MB User リッチ化 Asset Asset Server Upload 20 Download データ アップデート © DeNA Co., Ltd.

21.

スマートフォンアプリゲームの台頭 App 容量制限 Store クライアント リッチな表現のできるアプリゲームが台頭 アップデート ストアのアプリ容量制限の影響で起動後サーバーから User アセットをダウンロードするデータアップデートが主流に リッチ化 Download 100MB Asset Asset Server Upload 21 データ アップデート © DeNA Co., Ltd.

22.

データアップデート ⽉4回のイベントリリース 2週⽬イベント 1週⽬イベント クライアントアップデート Code 22 Asset 3週⽬イベント 4週⽬イベント データアップデート データアップデート データアップデート Asset Asset Asset © DeNA Co., Ltd.

23.

データアップデート ⽉4回のイベントリリース 2週⽬イベント 1週⽬イベント クライアントアップデート Code 23 コードの更新が不要 Asset 3週⽬イベント 4週⽬イベント データアップデート データアップデート データアップデート Asset Asset Asset © DeNA Co., Ltd.

24.

データアップデートによるイベント更新体制 アプリゲーム コンテンツの増加 ブラウザゲーム プランナーチーム発⾜ プランナー エンジニア⽐率の低下 レベルデザインチーム エンジニア イベントチーム 24 エンジニア © DeNA Co., Ltd.

25.

プランナーのみのマスタデータ開発フロー データアップデートはほぼプランナーのみなので開発サポートが必要 開発環境への⾃動反映 ※ 2014年当時 25 CI ⼊⼒サポート Foreign Keyの補完など Googleスプレッドシート + Google Apps Script © DeNA Co., Ltd.

26.

アセットのリッチ化と開発の⼤規模‧並列化 市場の成⻑とともにアセットもリッチ化 制作に6ヶ⽉以上かかることも 26 © DeNA Co., Ltd.

27.

アセットのリッチ化と開発の⼤規模‧並列化 6ヶ⽉以上 2週⽬イベント 1週⽬イベント クライアントアップデート Code 27 6ヶ⽉以上 Asset 6ヶ⽉以上 3週⽬イベント 6ヶ⽉以上 4週⽬イベント データアップデート データアップデート データアップデート Asset Asset Asset © DeNA Co., Ltd.

28.

アセットのリッチ化と開発の⼤規模‧並列化 6ヶ⽉以上 6ヶ⽉以上 6ヶ⽉以上 6ヶ⽉以上 何も対策しないと 4イベント x 6ヶ⽉ 3週⽬イベント = 24ブランチ 2週⽬イベント 1週⽬イベント 4週⽬イベント 程度の並⾏開発をすることになる クライアントアップデート Code 28 Asset データアップデート データアップデート データアップデート Asset Asset Asset © DeNA Co., Ltd.

29.

DeNAマスタデータの歴史 - まとめ 1. ブラウザゲーム時代は⼩規模にペアで開発していた 2. アプリゲームになったことで開発規模も組織も⼤きくなった 3. プランナーのみのチームができたことで開発サポートが必要になった 4. ⼤規模な並⾏開発が必要とされるようになった 29 © DeNA Co., Ltd.

30.

Oyakata導⼊以前の課題点 30 © DeNA Co., Ltd.

31.

課題1: マスタデータがとにかくコンフリクトする 31 © DeNA Co., Ltd.

32.

マスタデータがコンフリクトする原理 BranchA: Character 32 BranchB: Character ID Name HP ATK DEF AGI ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 + c4 Vinea 601 81 40 72 © DeNA Co., Ltd.

33.

マスタデータがコンフリクトする原理 BranchA: Character BranchB: Character ID Name HP ATK DEF AGI ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 + c4 Vinea 601 81 40 72 コンフリクト c3とc4は異なるレコードなので コンフリクトして欲しくない 33 © DeNA Co., Ltd.

34.

マスタデータがコンフリクトする原理 BranchA: Character BranchB: Character ID Name HP ATK DEF AGI ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 + c4 Vinea 601 81 40 72 なぜコンフリクトするのか コンフリクト c3とc4は異なるレコードなので コンフリクトして欲しくない 34 © DeNA Co., Ltd.

35.

マスタデータがコンフリクトする原理 BranchA: Character BranchB: Character Character.csv Character.csv CSVファイルがコンフリクトしている コンフリクト バージョン管理システムは ファイルパスで⼀意性を判定する 35 © DeNA Co., Ltd.

36.

バージョン管理とデータベースの⼀意性の違い バージョン管理システム データベース ⼀意性 ⼀意性 ファイルパス単位 レコード単位 (= テーブル単位) (= テーブル名 + Primary Key単位) ⼀意性が違うと 意図しないコンフリクトが発⽣する 36 © DeNA Co., Ltd.

37.

⼀意性を合わせてみる BranchA BranchB Character c1.csv Character c1.csv c2.csv + c3.csv c2.csv + c4.csv コンフリクトしない 37 © DeNA Co., Ltd.

38.

⼀意性を合わせてみる BranchA BranchB Character c1.csv Character c1.csv c2.csv c2.csv バージョン管理とデータベースの⼀意性の違いによって c3.csv c4.csv +無⽤なコンフリクトが発⽣する + 並⾏開発のブランチ数が多いとそれはそれは⼤変なことに コンフリクトしない 38 © DeNA Co., Ltd.

39.

課題2: Googleスプレッドシートから⾃動取り込みをすると ビルドが失敗しやすくなる 39 © DeNA Co., Ltd.

40.

Googleスプレッドシート Google スプレッドシートは、スプレッドシートの作成 や表⽰形式の設定、他のユーザーとの共同作業ができる オンライン スプレッドシート アプリです。 他のユーザーとリアルタイムで共同作業しながら編集できる 40 © DeNA Co., Ltd.

41.

Googleスプレッドシートの⾃動取り込み Google Apps Script Download Google Sheets commit Sheets API File Google Apps Script Sheets API 41 VCS Build で⾃動でBuildに取り込む © DeNA Co., Ltd.

42.

Googleスプレッドシートの⾃動取り込み Google Apps Script Download Google Sheets commit Sheets API File Google Apps Script Sheets API VCS Build で⾃動でBuildに取り込む とBuildが頻繁に失敗するようになる 42 © DeNA Co., Ltd.

43.

Googleスプレッドシートの⾃動取り込み Google Apps Script Download Google Sheets commit Sheets API File Google Apps Script Sheets API なぜか VCS Build で⾃動でBuildに取り込む とBuildが頻繁に失敗するようになる 43 © DeNA Co., Ltd.

44.

同時編集と⾃動インポート ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 ⽥中さんの差分を⾃動インポートする c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 ⽥中さんの差分 同時編集が可能 44 ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 + c4 Vinea ⼭⽥さんの中途半端な差分も混ざってしまう ⽥中さんの差分 ⼭⽥さんの差分 © DeNA Co., Ltd.

45.

同時編集と⾃動インポート ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 ⽥中さんの差分を⾃動インポートする c2 Sitri 460 119 51 48 ⽥中さんの差分 ⼭⽥さんの途中差分によってビルドが⽌まってしまう Purson 576 126 54 36 + c3 同時編集が可能 45 ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 + c4 Vinea ⼭⽥さんの中途半端な差分も混ざってしまう ⽥中さんの差分 ⼭⽥さんの差分 © DeNA Co., Ltd.

46.

同時編集と⾃動インポート Google スプレッドシートは、スプレッドシートの作成 や表⽰形式の設定、他のユーザーとの共同作業ができる オンライン スプレッドシート アプリです。 同時編集 = 常に編集中の可能性がある すなわち安定したバージョンの提供が不可能 同時編集可能なデータソースを プロダクトデータとして扱ってはいけない 46 © DeNA Co., Ltd.

47.

マスタデータ運⽤の課題点 1. DBとVCSの⼀意性の違いによりコンフリクトが頻発する 2. Googleスプレッドシートの⾃動取り込みがビルドを不安定にする 3. プランナーのみの組織で運⽤でカバーすることは難しい 47 © DeNA Co., Ltd.

48.

Oyakataに求められたこと マスタデータに適したバージョン管理 Gated Check-inのある開発フロー プランナーのみの組織でも開発可能 48 © DeNA Co., Ltd.

49.

⾃⼰紹介Profile 成⽥ 裕司 2017年新卒⼊社 ゲーム開発ツールや マスタデータ管理システム「Oyakata」 の開発‧リード‧マネジメントを担当 49 © DeNA Co., Ltd.

50.

Oyakataとは マスタデータ管理⽤の スプレッドシート x Github 50 © DeNA Co., Ltd.

51.

Oyakataとは 表形式⼊⼒ 51 © DeNA Co., Ltd.

52.

Oyakataとは プルリクエスト / バージョン管理 52 © DeNA Co., Ltd.

53.

Oyakataの機能 ● テーブル分割管理機能 ● Webhook ● フィルタ機能 ● バリデーションCLI ● JSON/CSV出⼒ ● CLI ( ghのようなCLIなど) 53 © DeNA Co., Ltd.

54.

Oyakataの機能 マスタデータの開発・運用に欲しい機能詰め合わせ 54 © DeNA Co., Ltd.

55.

Oyakataに求められたこと マスタデータに適したバージョン管理 Gated Check-inのある開発フロー プランナーのみの組織でも開発可能 55 © DeNA Co., Ltd.

56.

マスタデータに適したバージョン管理 Tables rows table r1.row c1.cell r1.row c2.cell r2.row r3.row + c3.cell ● Gitのフォルダパスのような階層構造 ● カラム(セル列)の追加されるケースの対応 56 © DeNA Co., Ltd.

57.

ドキュメントデータベース ● NoSQLの⼀種 ○ ドキュメント指向のデータベース ● スキーマレス構造 ○ データ構造が柔軟に変更可能 ● 複雑なデータ構造のサポート ○ JSON形式のドキュメントで保存 57 © DeNA Co., Ltd.

58.

Oyakataのバージョン管理 ドキュメントデータベース x バージョン管理機能 58 © DeNA Co., Ltd.

59.

Oyakataのバージョン管理 ● noms ○ バージョン管理機能を備えた分散型データベース ■ Git Likeな機能 ○ ドキュメントDB ■ INSERTのみに対応 ■ トランザクション対応 ○ Public archiveされている https://github.com/attic-labs/noms 59 © DeNA Co., Ltd.

60.

Oyakataのバージョン管理 Table Table: Character ● ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 Cell Cell Row Cell 表形式からドキュメントデータベースの形式へ ○ key-value ペア ○ key x オブジェクトのコレクション ■ 60 Row Cell パスによる判定が可能な状態へ © DeNA Co., Ltd.

61.

Keyについて ユーザ⼊⼒によって決定される PrimaryKeyとは別に2種類の内部ID スノーフレークID - 64bitのユニークID⽣成アルゴリム - 時系列順に追加 - ⾏以外の管理に使⽤ ⾏管理⽤のID - テーブルID, カラムID, PrimaryKey でユニークなIDを⽣成 - PrimaryKeyの⼀意性を重視 ユニークIDと各データオブジェクトの組み合わせ 61 © DeNA Co., Ltd.

62.

データ構造と2次元表現 ta3f Character ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 Character rc1c row c1 … Asmodeus ta3f rc1c ID Name HP ATK DEF AGI age 66e tef 3ev 32g 98a 98a 31 Character の c1 の⾏ の AGIカラム の 値 の位置 tables[ta3f].rows[rc1c].cells[98a] = 31 ⼀意のIDを⽤いたパスで表現 62 © DeNA Co., Ltd.

63.

値の変更の挙動 develop: Character ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 BranchA: Character BranchB: Character ID Name HP ATK DEF AGI ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 35 c1 Asmodeus 685 135 39 30 Character の c1 の⾏ の AGIカラム の 値 を変更 ● ● 63 BranchA は 31 → 35 BranchB は 31 → 30 tables[ta3f].rows[rc1c].cells[98a] = 35 tables[ta3f].rows[rc1c].cells[98a] = 30 © DeNA Co., Ltd.

64.

差分 BranchA: Character BranchB: Character ID Name HP ATK DEF AGI ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 35 c1 Asmodeus 685 135 39 30 tables[ta3f].rows[rc1c].cells[98a] = 35 tables[ta3f].rows[rc1c].cells[98a] = 30 tables[ta3f].rows[rc1c].cells[98a] - 35 + 30 1. 2. 64 IDとパスによる変更箇所の決定 同じパス先に保持される値と変更を⽐較 © DeNA Co., Ltd.

65.

コンフリクト BranchA: Character BranchB: Character ID Name HP ATK DEF AGI ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 35 c1 Asmodeus 685 135 39 30 tables[ta3f].rows[rc1c].cells[98a] = 35 tables[ta3f].rows[rc1c].cells[98a] = 30 develop: Character ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 tables[ta3f].rows[rc1c].cells[98a] = ?? コンフリクト 31 → 35 vs 31 → 30 3way-mergeによって、同じパス先に元の値とそれぞれ⽐較し取り込むため 変更した最⼩限の箇所だけに集中できる 65 © DeNA Co., Ltd.

66.

⾏の追加 同じ⾏へのデータ追加の挙動はどうなるか BranchA: Character 66 BranchB: Character ID Name HP ATK DEF AGI ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 + c4 Vinea 601 81 40 72 © DeNA Co., Ltd.

67.

⾏の追加 BranchA: Character BranchB: Character ID Name HP ATK DEF AGI ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 + c4 Vinea 601 81 40 72 内部IDで別々のIDが付与 67 RowID ID Name HP ATK DEF AGI RowID ID Name HP ATK DEF AGI 1cag c1 Asmodeus 685 135 39 31 1cag c1 Asmodeus 685 135 39 31 b1xe c2 Sitri 460 119 51 48 b1xe c2 Sitri 460 119 51 48 ce32 + c3 Purson 576 126 54 36 ag6y + c4 Vinea 601 81 40 72 © DeNA Co., Ltd.

68.

⾏の追加 BranchA: Character BranchB: Character ID Name HP ATK DEF AGI ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 c2 Sitri 460 119 51 48 + c3 Purson 576 126 54 36 + c4 Vinea 601 81 40 72 Merged: Character 68 ID Name HP ATK DEF AGI c1 Asmodeus 685 135 39 31 c2 Sitri 460 119 51 48 ag6y + c4 Vinea 601 81 40 72 ce32 + c3 Purson 576 126 54 36 © DeNA Co., Ltd.

69.

列の追加 BranchA: Character ID Name HP ATK DEF AGI + SkillID c1 Asmodeus 685 135 39 31 + s1 c2 Sitri 460 119 51 48 + s2 BranchB: Character ID Name HP ATK DEF AGI + Memo c1 Asmodeus 685 135 39 31 + c2 Sitri 460 119 51 48 + m1 スキーマ変更による列の追加はどうなるか 69 © DeNA Co., Ltd.

70.

列の追加 BranchA: Character ID Name HP ATK DEF AGI + SkillID c1 Asmodeus 685 135 39 31 + s1 c2 Sitri 460 119 51 48 + s2 BranchB: Character ID Name HP ATK DEF AGI + Memo c1 Asmodeus 685 135 39 31 + c2 Sitri 460 119 51 48 + ID Name HP ATK DEF AGI + SkillID c1 Asmodeus 685 135 39 31 + s1 + c2 Sitri 460 119 51 48 + s2 + m1 Merged: Character 70 + Memo m1 © DeNA Co., Ltd.

71.

列の追加 BranchA: Character ID Name HP ATK DEF AGI + SkillID c1 Asmodeus 685 135 39 31 + asi c2 Sitri 460 119 51 48 + yuk ● ● ● BranchB: Character 列はカラムに依存 セルそれぞれに内部IDを付与 全ての列へセルを追加 ID Name HP ATK DEF AGI + Memo c1 Asmodeus 685 135 39 31 + bmg c2 Sitri 460 119 51 48 + omj ID Name HP ATK DEF AGI + SkillID c1 Asmodeus 685 135 39 31 + asi + bmg c2 Sitri 460 119 51 48 + yuk + omj Merged: Character 71 + Memo © DeNA Co., Ltd.

72.

Oyakataのバージョン管理対象 ● ● ● ● ● ● 72 スキーマ テーブル ビュー ○ テーブルを複数まとめるルール リレーション ○ テーブル/ビューの参照関係 バリデーションスクリプト パッケージ ○ フィルタルール © DeNA Co., Ltd.

73.

Oyakataのバージョン管理でできたこと ● 内部のユニークIDを使⽤してデータ管理 ○ コンフリクトが発⽣しにくい設計 ● コンフリクト検知 ○ 最⼩単位でのコンフリクト検知が可能 ● データの整合性とスムーズなデータ追加 ○ バージョニングとデータ追加を重視 73 © DeNA Co., Ltd.

74.

Oyakataに求められたこと マスタデータに適したバージョン管理 Gated Check-inのある開発フロー プランナーのみの組織でも開発可能 74 © DeNA Co., Ltd.

75.

データの安定性の取り組み マスタデータが不備がない状態を担保 75 © DeNA Co., Ltd.

76.

2種類のブランチとルール 共有ブランチ(fixブランチ) ● ● 直接の編集コミットは不可 PRを通したマージのみで変更可能 ○ 不⽤意な変更の抑⽌ 作業ブランチ(workブランチ) ● ● ● 76 安全な共有ブランチから作成 作業ごとに作成(CI/プランナー) 同時編集の抑制 © DeNA Co., Ltd.

77.

⼊⼒時チェック ● PrimaryKeyの重複チェック ● 型チェック ● 閾値 77 © DeNA Co., Ltd.

78.

⼊⼒補助 リレーション ● テーブル間の参照を定義することで有効化 ● PK⼊⼒をサポート ○ PKと参照⽤の値の組み合わた辞書 ● Excelでも対応 78 © DeNA Co., Ltd.

79.

プルリクエスト ● Githubと同様の機能を提供 ○ パスによって表される最⼩単位での差分表⽰ ○ Web上でのコンフリクト解決を提供 ○ CIステータスによるマージ制御 79 © DeNA Co., Ltd.

80.

差分表⽰ 変更の影響単位で差分表⽰ ● テーブル/⾏ ○ 新規追加/削除 ● セル ○ ○ 80 新規追加/削除 ■ カラムへの編集 編集 ■ パラメータの変更 © DeNA Co., Ltd.

81.

コンフリクト解消 PR画⾯上でコンフリクトの確認‧解決 ● ● 81 変更対象のパスから最⼩箇所 どちらのブランチを優先かの選択 © DeNA Co., Ltd.

82.

Gated Check-in CIによる共有ブランチへ不正な適⽤を防ぐ 82 © DeNA Co., Ltd.

83.

ステータスチェックとCI Oyakata Validator CLI マスタデータに対して設定された バリデーションスクリプトに従いマスタデータのテストをするツール バリデーションスクリプト ● 独⾃拡張されたmrubyで記述 ○ 独⾃のテスト機能を提供 ● マスタデータへの参照が可能 ○ ○ 83 テスト対象のテーブル 関連づけられたテーブル © DeNA Co., Ltd.

84.

データの安定性の取り組み ● ● ● ● ● 84 作業ブランチによる独⽴した作業空間 ⼊⼒時のチェック ⼊⼒補助 保存時のチェック プルリクエスト ○ 差分/レビューによるチェック ○ CIによるチェックとマージ制限 ○ コンフリクトによる不正な上書きのチェック © DeNA Co., Ltd.

85.

Oyakataに求められたこと マスタデータに適したバージョン管理 Gated Check-inのある開発フロー プランナーのみの組織でも開発可能 85 © DeNA Co., Ltd.

86.

Oyakataの開発フロー ● スキーマの定義 エンジニア ● テーブルの設定 ● 参照関係の定義 ● バリデーション 記述‧設定 86 © DeNA Co., Ltd.

87.

Oyakataの開発フロー 作業ごとのブランチで作業 CIによる検査 動作確認 PR作成 プランナー 差分確認 マージ 各種⽅法で⼊⼒ コンフリクト解消 87 © DeNA Co., Ltd.

88.

まとめ これまでのDeNAでの⼤規模‧並⾏開発になったマスタデータ運⽤課題から マスタデータ専⽤の管理ツールとしてOyakataを開発 Oyakataは、バージョン管理機能、ブランチ機能、データ変換機能や データ編集機能を提供し、マスタデータの⼀元管理の役割を担う 開発規模が拡⼤しても、安定したマスタデータ管理が可能な マスタデータ開発フローの構築を実現 88 © DeNA Co., Ltd.

89.

Thank you for listening! 89 © DeNA Co., Ltd.