【雑記】JSON型DBでクイズDBを作る

 前回、雑記としてJSON型でクイズ情報を扱う試みを行なった。ただし、記事内にもあるとおり荒い内容のため、クイズDBを作成するための実用的な内容へ昇華していきたい。
 とは言いつつ筆者は各方面について素人のため、引き続き雑記として、少しずつ考えを整理していくこととする。(つまり、現時点では未完成
 また、本内容の取っ掛かりとして澤木恭介氏の記事「雑感(クイズ問題の盗用と森羅万象データベースとか)」を参考にしている。

0.前提など

・JSONの基本は知らなくても読めるようにするつもり。
・JSON型DBとしてMongo DBの利用を前提としている。
・_id項目の記載は省く。(この辺の感覚が素人)
・DB名はQuizDBと仮置きする。
・公開済みのabc/EQIDEN過去問から問題を使用している。使用時は出典を記載する。

1.検討

 クイズDBとして必要な機能を検討する。

1.1.RDBと同じ機能を持たせる

 既存のクイズDBの多くはRDBである。Excelのような表形式で整理されたものと考えてもらえれば良い。次の2問を使用する。

Q.太平洋戦争のとき、日本を軍事・経済的に包囲した「ABCDライン」の4カ国とは、アメリカ、イギリス、中国とどこの国でしょう?
A.オランダ

abc the first (2003)通常問題 #0001

Q.フランス語で「選び出す」という意味がある、社会の指導的立場に立っている人を何というでしょう?
A.エリート

abc the first (2003)通常問題 #0002

 これをJSON型で表現すると次のようになる。

{
  "Question":"太平洋戦争のとき、日本を軍事・経済的に包囲した「ABCDライン」の4カ国とは、アメリカ、イギリス、中国とどこの国でしょう?",
  "Answer":"オランダ"
}
{
  "Question":"フランス語で「選び出す」という意味がある、社会の指導的立場に立っている人を何というでしょう?",
  "Answer":"エリート"
}

 このように、1つの問題と答えのセットは{}で括られており、それぞれ問題文に"Question"、答えに"Answer"という「key」が付けられている。
 このようなデータが「QuizDB」という名前のDBに入っている場合、下記のような使い方ができる。
・答えが「オランダ」の問題を探す。
 QuizDB.find({Answer:"オランダ"})
・問題文に「フランス語」が含まれる問題を探す。
 QuizDB.find({Question:"/フランス語/"})
 これでRDBと同じ機能を持たせることができるはず。

1.2.問題の切り口を表現する

 以下の問題はいずれもイーゼルについて同じ切り口で記載された問題である。

Q.オランダ語で「ロバ」という意味がある、絵を描くときにキャンバスを立てかけるための台のことを何というでしょう?
A.イーゼル

誤3 (2005)通常問題 #0124

Q.オランダ語で「ロバ」という意味がある、絵を描くときにキャンパスを載せる台を何というでしょう?
A.イーゼル

abc the eighth (2010)通常問題 #0389

Q.オランダ語で「ロバ」という意味がある、絵を描くときにカンバスを載せる台のことを何というでしょう?
A.イーゼル[easel]【「画架」は×】

abc the tenth (2012)通常問題 #0627

 JSON型DBを作成する上での大きな目的として、切り口観点で検索をしたいというのがある。なので、これらは本質的に同じ問題として扱いたい。
 そこで、問題文を次のように整理する。

{
  "Question":"オランダ語で「ロバ」という意味がある、絵を描くときにキャンバスを立てかけるための台のことを何というでしょう?",
  "Answer":"イーゼル",
  "語源":{
    "言語":"オランダ語",
    "意味":"ロバ"
  },
  "使用方法":"キャンバスを立てかける",
  "使用場面":"絵を描くとき",
  "物":"台"
},
{
  "Question":"オランダ語で「ロバ」という意味がある、絵を描くときにキャンパスを載せる台を何というでしょう?",
  "Answer":"イーゼル",
  "語源":{
    "言語":"オランダ語",
    "意味":"ロバ"
  },
  "使用方法":"キャンパスを載せる",
  "使用場面":"絵を描くとき",
  "物":"台"
},
{
  "Question":"オランダ語で「ロバ」という意味がある、絵を描くときにキャンバスを立てかけるための台のことを何というでしょう?",
  "Answer":"イーゼル[easel]【「画架」は×】",
//別解の記載方法は検討が必要。キー重複のような形で扱いたい。
  "Answer2":"easel",
  "Supplement":"「画架」は×",
  "語源":{
    "言語":"オランダ語",
    "意味":"ロバ"
  },
  "使用方法":"カンバスを載せる",
  "使用場面":"絵を描くとき",
  "物":"台"
}

 このように整理すれば、表記揺れの違いはあるものの構造が同じであることがわかる。(以下、工事中)

メモ
・valueの表記揺れは許すが、構造の揺れやkeyの揺れは許されない。どう定義していくのが良いか。
・QuizDB.find({語源.言語:"オランダ語"})で検索できることはRDBよりも優位性があると言えるか。


この記事が気に入ったらサポートをしてみませんか?