[JavaScript] 2014アニメのデータベースを作りたい その2 | ERMaster編

2014/12/10

こんにちは、きんくまです。

前回データをjson形式まで書き出すところまで行いました。
今回それを使ってデータベースを作ろうと思ったのですが、その前にデータベースの構造を考えておく必要があることに気づきました。

サンプルのjsonを見てみます。

{
  "title": "ガンダム Gのレコンギスタ",
  "summary": "『ガンダム Gのレコンギスタ』(ガンダム ジーのレコンギスタ、 Gundam Reconguista in G)は、2014年(平成26年)10月よりMBSほか『アニメイズム』B1にて放送中の日本のテレビアニメ。「ガンダムシリーズ」のひとつ。略称は『Gレコ』。",
  "original_by[]": [
    "矢立肇",
    "富野由悠季"
  ],
  "written_by[]": "富野由悠季",
  "character_design[]": "吉田健一",
  "mechanic_design[]": [
    "安田朗",
    "形部一平",
    "山根公利"
  ],
  "music_by[]": "菅野祐悟",
  "studio[]": "サンライズ",
  "production[]": [
    "サンライズ",
    "MBS"
  ],
  "run_month_from": "2014-10",
  "run_month_to": "",
  "episodes": "26",
  "genre[]": "ロボット"
}

悩んだのがクレジットされている名称(クレジット名)をどうやってまとめるかということです。クレジット名は

1. 個人のクリエイター
2. 企業
3. 企業とも違う形態の組織

がありました。

3の企業とも違う形態の組織というのは、製作のところに出てくる「○○製作委員会」みたいなものです。最近は製作委員会という名前がつかなくて、「東亜重工動画制作局」なんていう名前になっている場合もあります。

また個人のクリエイター名でも、上のGレコの原作者で矢立肇というのがありますが、これは実在する人物ではなくて版権管理のための名称です。

で、細かいところは目をつぶり、クレジット名は以下の2種類にすることにしました。

・個人(版権管理の名称含む)
・組織(企業含む)

原作者をふりわけ

原作の部分以外は、すぐに個人か組織に振り分けることが可能なのですが、原作はどちらも混ざっている場合がありました。なので、jsonを目視で手動で振り分けをして、個人の場合は名前の後ろに |c をつけて、組織の場合は |o をつけることにしました。
| は区切り文字で、c = creator(クリエイター), o = organization(組織)です。

Gレコだとこんな感じ

  "original_by[]": [
    "矢立肇|c",
    "富野由悠季|c"
  ],

あとでjavascriptでDBにデータを入れるときに、| の区切り文字で分割して、後ろの文字で属性(個人か組織)を判定しようという想定です。

多対多の関連

次に実際のテーブルに分けていくときに関連(Relationship)を作るのですが、以前に読んだ本によると、多対多の関係のときには、間にひとつテーブルを作成して、1対多に置き換えるというセオリーがあるそうです。

この本でございまする。

ちなみに英語で調べてみると、junction tableとかmap tableとかいろいろと名前がついているようです。
>> Junction table

今回はある作品にクレジットされている名称が別の作品にクレジットされていることがある、まさに多対多の関係がたくさんあります。
なので、例えば原作者だったら

作品 – 作品クレジット名 – クレジット名

みたいな関連を作りました。

あとCoreDataだと、この多対多の関係でも直接結ぶことができたはず。内部でどう実装されているかわからないけど、たぶんjunction tableを作っているんじゃないのかな。

モデリングツール ERMaster

テーブル構造をプログラムで1から書いていくのもよいのですが、調べてみるとモデリングツールというのが世の中にはあるみたいです。中でもEclipseプラグインのERMasterというのがあって、それが便利そうでした。

>> ERMaster

ぐぐるとすごく有名でかつ評判のツールみたいです。
>> ぐぐる

実際にとても簡単に使えました。


これを使ってみて1つだけ重要なことがありまして、、。私の環境で(OS X 10.9.6, java version “1.6.0_65″)DDL(定義用のSQL)を書き出そうとするとエラーが出て書き出せないことが判明。
いろいろとEclipseのバージョン違いをインストールとかやってみたのですが、うまくいきませんでした。
最後はあきらめて、Parallels上のWin7にWin版のEclipseを入れてそっちで書き出すことにしました。

で、できたものがこちら。(ER図)
この画像も下のSQLもERMasterで書き出したものです。あとなんかExcel形式で資料っぽいのも出せました。

anime2014_db


/* Drop Tables */

DROP TABLE [WorkCreditTitles];
DROP TABLE [CreditTitles];
DROP TABLE [CreditTitleTypes];
DROP TABLE [GenreWorks];
DROP TABLE [Genres];
DROP TABLE [WorkCreditTitleTypes];
DROP TABLE [Works];




/* Create Tables */

CREATE TABLE [CreditTitleTypes]
(
	[credit_title_type_id] integer,
	[credit_title_type_name] text NOT NULL,
	PRIMARY KEY ([credit_title_type_id])
);


CREATE TABLE [CreditTitles]
(
	[credit_title_id] integer PRIMARY KEY AUTOINCREMENT,
	[credit_title_name] text NOT NULL,
	[credit_title_type_id] integer,
	FOREIGN KEY ([credit_title_type_id])
	REFERENCES [CreditTitleTypes] ([credit_title_type_id])
);


CREATE TABLE [Genres]
(
	[genre_id] integer PRIMARY KEY AUTOINCREMENT,
	[genre_name] text NOT NULL
);


CREATE TABLE [Works]
(
	[work_id] integer PRIMARY KEY AUTOINCREMENT,
	[work_title] text NOT NULL,
	[work_summary] text,
	[work_month_from] text,
	[work_month_from_time] integer,
	[work_month_to] text,
	[work_month_to_time] integer,
	[work_episodes] integer
);


CREATE TABLE [GenreWorks]
(
	[genre_id] integer NOT NULL,
	[work_id] integer NOT NULL,
	PRIMARY KEY ([genre_id], [work_id]),
	FOREIGN KEY ([genre_id])
	REFERENCES [Genres] ([genre_id]),
	FOREIGN KEY ([work_id])
	REFERENCES [Works] ([work_id])
);


CREATE TABLE [WorkCreditTitleTypes]
(
	[work_credit_type_id] integer NOT NULL,
	[work_credit_type_name] text NOT NULL,
	PRIMARY KEY ([work_credit_type_id])
);


CREATE TABLE [WorkCreditTitles]
(
	[work_id] integer NOT NULL,
	[credit_title_id] integer NOT NULL,
	[work_credit_type_id] integer NOT NULL,
	PRIMARY KEY ([work_id], [credit_title_id]),
	FOREIGN KEY ([work_id])
	REFERENCES [Works] ([work_id]),
	FOREIGN KEY ([credit_title_id])
	REFERENCES [CreditTitles] ([credit_title_id]),
	FOREIGN KEY ([work_credit_type_id])
	REFERENCES [WorkCreditTitleTypes] ([work_credit_type_id])
);

というところまですすめて、ようやくプログラムの下準備ができました。
次回はNodeでSQLiteにデータを入れてみます。

今回やってみて、テーブルの構造をどうやってもたせるのかはかなり悩みました。最初は個人と組織を別テーブルにしたりしました。ただそうすると個人と組織両方がある原作者のところで無理が出そうだったので、クレジット名という1つのテーブルにまとめて属性で判定することにしました。

同じデータをモデリングしても、人によって設計するテーブル構造がたぶん違ってくると思います。このあたりはなかなか面白そうだなと思いました。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る