2012/01/08

RESTfulWebサービス設計課題 和暦検索 #03 提供データの特定とER図

RESTfulWebサービスの第3回目は、提供データの特定とER図の作成です。

本題のリソース設計に入る前に、サービスとして提供するデータを特定します。提供するデータは要求でかなり明らかになっていますが、構造化されていないため何をリソースとして管理すべきか分かりません。
そこでまずは、必要なデータをRDBのテーブル設計の要領でER図に落としてみました。それが下図です。(「astah*」のクラス図を使って作成したためプライマリキー(PK)が表現できていませんが、「テーブル名ID」がPKです。)
1. 説明
(1)南北朝の問題は「時代・王朝」を提供データとして設けることによって対応
南北朝や大覚寺統/亀山統の解決方法に悩みましたが、要求中には明示されていなかった「時代・王朝」を設けることで対応しました。これにより日本の平安時代の年号一覧などの機能(要求にはありませんでしたが)にも対応可能になります。
また、他の国/地域の王朝も区別できるようになります。特に中国では複数の王朝で同じ元号(「建武」など)が使用されることもあったようで、区別が容易になります。

(2)4カ国・地域共通データと日本独自データに分割
「時代・王朝」は共通データとして「元号」から参照しています。しかし「天皇」は日本独自データとして、天皇と元号を紐付けるデータを別途持たせるようにしました。
最初は「天皇」を「皇帝・天皇・国王」のように読み替えて「元号」と「時代・王朝」の間に挟むことも考えました。そうすれば、全て共通のデータ構造になるからです。
しかし
・日本の場合「将軍」や「総理大臣」という軸も考えられてなかなか複雑であること
・基本的には天皇の交代時に改元されがもし例外があった場合の処理が複雑になること
・中国/朝鮮半島/ベトナムの元号の詳細が勉強不足で分かっていないこと
メインコンセプトである「西暦による各国元号の串刺し」には直接関係しないこと
から、断念しました。

2. 主な問題点と変更点
(1)2時代に跨がる元号の存在
実は「時代・王朝」の対応には、問題がありました。
日本では1つの元号が2つの時代に跨がることがあり、例えば「延暦」は西暦782年〜806年のため奈良時代と平安時代の両方に属します。少し複雑になりますが、「元号」のデータを2時代分重複してもつことで対応可能なので、正規化して「元号_時代・王朝」を設けました。

(2)「西暦」を削除
西暦ID = 西暦 で問題なさそうなので、「西暦」を作ったのはちょっとやり過ぎでした。
(が、下図のように消してから気が付きましたが、リソース設計用のデータ構造を示すだけなのでの残しておいた方が良かったように思えます。)

ということで変更後のER図を以下に示します。

3. 課題
(1)正規化し過ぎ
このER図は、リソース設計を行うためのデータの構造化として作成しました。
CRUDのうち基本的に使用するのは「C」と「R」のみで、しかも「C」を行うのは管理者のみであることを考えると、ほとんどの処理は「R」で、管理者がたまに簡単な「C」と「R」を行うのみであることを考えると(2012/01/09修正。改元時に終期の「U」があることの考慮もれ)、ここまでの正規化は行き過ぎかもしれません。
また現状では、RDBではなくGAEのBigTableに載せることを考えています。「元号年」のデータ数は多く見ても1万件程度のオーダーですので、ごりごりテーブルを結合させても大丈夫かと思いますが、詳細設計の段階では正規化を崩すことの検討も必要です。

(2)歴史学上の議論
元号、王朝、時代、その他諸々、今回のアプリで扱うデータの値にはいろいろ議論のあるところです。いくつかバリエーションを持たせることも不可能ではありませんが、ここでは何かひとつ決めうちで対応することにします。
たとえば「元号の読み」ですが、明治以前は明示されていないため複数の読み方が成立します。しかし今回は複数の読は対応せず、私の独断と偏見で読みを1つに絞らせて頂きます。

4. 要求の再確認
要求を上から順番に確認し、実現できないものないことを確認して本日は終了です。
○1. 機能要求
 ○1-1. 西暦から和暦を知りたい(例:西暦2012年 -> 平成24年)
  ○1-1-1. 西暦に対応する和暦が存在しない場合は、その旨を教えて欲しい
  ○1-1-2. 西暦に対応する和暦が複数存在する場合
   ○1-1-2-1. 改元の場合は、改元月日と併せて全和暦を表示して欲しい
   ○1-1-2-2. 南北朝期の場合は、南朝/北朝両方の和暦を表示して欲しい
 ○1-2. 和暦から西暦を知りたい(例:平成24年 -> 西暦2012年)
 ○1-3. 元号から和暦情報を知りたい
  ○1-3-1. 和暦情報としては少なくとも以下の項目が欲しい
      元号名、元号名の読み、元号の年数、始期(年月日)、終期(年月日)、天皇名、天皇名の読み
  1-3-2. 元号名の部分一致で和暦情報を検索したい
  1-3-3. 元号名の読みの部分一致で和暦情報を検索したい
 1-4. 天皇から和暦情報を知りたい
  1-4-1. 天皇名で和暦情報を部分一致検索したい
  1-4-2. 天皇名の読みで和暦情報を部分一致検索したい
 1-5. 他アプリへのサービス提供を可能とするためJSON形式のデータが欲しい
 1-6. もちろん人間の読みやすい形でのデータも欲しい
○2.非機能要求
 2-1. 他の元号使用国(中国、ベトナム、朝鮮半島)用機能の追加が容易な設計にして欲しい
 2-2. 機密情報は扱わず、ユーザー管理も行わないのでセキュリティに配慮する必要はない

以上、お疲れさまでした。



0 件のコメント:

コメントを投稿