SQLで階層構造を扱う方法
dtn.jpのディレクトリはSQLでカテゴリ情報や階層構造を管理しています。そこで重要となるのがSQLでの階層構造データの保持です。
下記のような階層構造をテーブルで保存するには少々小細工が必要となります。
┬─A
├─B─D
│ ├─E
│ └─F
└C
テーブル内で階層構造を保持するために参考としたのがこちらの掲示板記事でした。
要は、テーブル内で保持する各カテゴリの情報に親カテゴリの番号を持たせておけば、階層構造を二次元的に保持することができるといった感じです。
dtnディレクトリでもこのような感じでカテゴリ用テーブルを作ってみました。
+-------------+----------------------+--------+
| cate_id | name | parent |
+-------------+----------------------+--------+
| 1 | エンタメ | NULL |
| 2 | 芸術と人文 | NULL |
| 3 | ビジネスと経済 | NULL |
| 4 | 音楽 | 1 |
| 5 | お笑い、ユーモア | 1 |
| 6 | 外国のアート | 2 |
プログラムで階層に出力
このカテゴリテーブルの情報を元にして、HTMLファイルをディレクトリ構造で出力したり、下記のようなパンくずリストを生成したりしていきます。
トップページ > コンピュータとインターネット > インターネット > ホームページ、ウェブサイト
階層構造を複雑化させたい
当初はテーブル構造を単純にディレクトリに出力させるで満足しておりましたが、運用していくうちに次第に欲がでてきました。
例えば、親カテゴリが全く別のカテゴリを下層にリンクとして表示したいといったパターンです。
┬─趣味とスポーツ
│ └─自動車
│ └─★
│
├─ビジネスと経済
│ └─ショッピングとサービス
│ └─自動車、オートバイ
│ └─メーカー、ブランド(これを★に)
└─政治
「趣味とスポーツ > 自動車」の階層下の★部分に、全く異なるカテゴリにある「ビジネスと経済 > ショッピングとサービス > 自動車、オートバイ > メーカー、ブランド」を表示させたいといった場合です。
SQLのテーブル構造をプログラムで吐き出すため、これをやるには手で修正をかける必要がありましたが、これをプログラムで実現できるように管理画面やHTML生成プログラムに修正をかけました。
結果、このディレクトリ型検索エンジンdtn > 趣味とスポーツ > 自動車カテゴリのような形で、親カテゴリが異なるカテゴリ同士をリンクで接続させることができました。
おわりに
訪問された方にとっては、ほとんど全くどうでもよいことで、気が付きもしないとは思いますが、自己満足のプログラム修正作業をしたというご報告でした。