理事長のSQLパズル:階層つき分類の粒度

 ぐっと秋深まり肌寒い日々が続きますが、体調を崩してはいませんか? 私の職場でも今週は風邪引きが急増しておりました。皆様くれぐれもご用心なさいますよう。

 というわけで今月もやってまいりました。理事長のSQLパズルのお時間です。どうぞよろしくお付き合いください。今月は、これまでと趣向を変えて設計寄りの話です。最近ちょっと新境地でも開いてみようかと思案中で、その一環。

 私たちが扱うデータの中には、単純に何らかの事実を記述する生のデータ以外に、そのデータについて「分類」を行うための一種のメタデータが存在します。大体コードとか階級という名前で呼ばれています。皆さんも仕事で使っているでしょう。

 で、今回取り上げたいのは、「階層つきの分類」についてです。大分類、中分類、小分類・・・というレベルの差異が存在するようなタイプですな。具体例を挙げると、私も実際に扱ったことがあるICD-10なんかがそうです。病気の分類に使われる国際標準的なコードで、頭文字のアルファベットが大分類、続く2桁の数字が中分類、さらに細かい指定をする小分類、と三段階の階層を持つ、オーソドクスな階層つき分類です。例えば、「器質性幻覚症」のICD10コードは、「F060」ですが、これは「F」+「06」+「0」に分解されます。

 こういう分類コードは、マスタテーブルとして保存することになるわけですが、その場合、やり方が以下の二通りに分かれます(本当は、経年で体系が変化することも考慮するとパターンは増えるのだけど、その観点は今は無視)。

  • A案:大・中・小の3列を持つ。
  • B案:一列に大・中・小分類を結合して持つ。


 どちらの方法でも、最終的に満たせない要件は無いので、まあ設計者の「好み」の一存で決められてしまうケースが多い箇所です。A案を取ったときに、一列にまとめたければ文字列連結子の「||」を使えばよいですし、B案をとったときに細かく分解したいときは、SUSTRINGなど文字列関数で切り出すだけです。このように互換性もあるので、どちらかが確実に「悪い」と断定できる比較ではありません。そのためでしょう、比率としても、半々ぐらいで見かける気がします。

 さて、皆さんがテーブル設計をするなら、どちらの案を採用するでしょうか? その案のメリット、および対案のデメリットを、それぞれ考えてください(どちらも同じぐらい出そうだけど)。