唯々諾々 (しません)

冷静な議論ができる方からのマサカリは大歓迎です。

ポケモンで学ぶRDB用語とセキュリティ 1

※本シリーズはフィクションであり、現実の実装とはなんら関係ありません。また間違いはいつでもご報告いただけますと幸いです。

それは私のこんな単純な疑問とChatGPT-4 (以下チャーちゃん) の会話から始まった―

ワイ「投げたポケモンボールってどこ行ってるの? (バトル時のつもりだった)」
チャーちゃん「ポケモンの世界において、ポケモンボールを投げることでポケモンを捕まえることができます。しかし、ポケモンポールがどこへ行くのかは、ゲーム内の物語や設定で明確に説明されていません。
一般的な解釈では、捕まえたポケモンポケモンボールの中にデジタルデータ化され、
レーナーが持ち歩くことができる状態になります。トレーナーが6匹以上のポケモンを持っている場合、新しく捕まえたポケモンはボケモンボールごとポケモンセンターに送られ、そこで保管されます。
しかし、これはあくまでゲーム内での表現であり、現実世界でのポケモンポールの存在や挙動はありません。ゲームやアニメの世界観を楽しむための架空の設定です。」

 

真偽はともかくとして、ボールの中に入ること = 実体のデジタルデータ化であるという発想は面白い。しかもポケモンとくればボックスというデータベースの基礎があるではないか。これでRDBを理解してみよう、というのが、DBは秋しか無いことに気づいて急遽雑に申し込んだSC試験を4/16に控えwebとセキュリティとDBから逃げ回っているデータサイエンティスト見習いの発想であった...

ポケモンを一意に定めよう

まず重要なのはオブジェクト (今回なら存在するポケモンすべて) の一意化である。なんでもいいがなんかしらのキーで一意に定まるようになっていないオブジェクトはDBに載っけようがない。どこかの大学では学籍が2つに分裂していた。が、本来こんなことが起こるデータベースはデータベースではない (と思う)。

例えばこのようなものはどうだろうか: トレーナーID+ポケモン図鑑番号+捕獲日時とタイムゾーンの文字列をSHA256なりSHA3系256bit以上でハッシュ化する。トレーナーIDがヒスイから今まで被らずつけられているという前提には基づくが、これならばハッシュ関数衝突発見困難性により、バグらせなければ同じハッシュ値を持つ同種のポケモンはまずおらず、多分一意に定まると思ってよいだろう (しらんけど)。これで一意化はざっくり成功だ。

ポケモン図鑑ってなんだろう

そもそもポケモン図鑑も一種のRDBである。ポケモン図鑑 (ぜんこく) を設計してみよう。

ポケモン図鑑に必要な属性は次のとおりである。

1. 全国図鑑No.

2. 種族名

3. 持ちうるとくせいと夢特性

4. タイプ (いまのところ少なくとも1つ最大2つ)

5. メガシンカを持つ場合のタイプと名前など

6. リージョンフォームがある場合のタイプと名前など

7. 進化先進化前がある場合の関連性

8. 生息地

9. 地方図鑑番号

10. ビット絵 or 3Dモデル (色違い分も)

気が遠くなってきた。特に5はどうすべきかわからない。進化前と進化後という属性にすべきだろうか。しかしイーブイ系列が地獄である。テラスタイプはすべてのポケモンがすべてのタイプを取れることに現状なっているからトレーナーのボックスのほうの設計に盛り込もう。タイプやとくせいは別にDBを作って番号を振ったほうが良いのは間違いない。

トレーナーのボックスの実装

トレーナーのボックスはさっきの一意化のkeyとポケモンの全国番号だけ持っておけば使えるには使えるが、その他に次の属性がある。

1. (もう無くなったが) ポケルス感染履歴の有無

2. テラスタイプ

3. 持ち物

4. 努力値

5. 証・リボン

6. 色違いか否か

7. いつどこで出会ったか

8. 覚えているわざと覚えてきた技

9. 最初の持ち主

もう嫌になってきた。要件を書き出すだけでだいぶつらい。

これをインターネットで交換しよう。明日に続け!