現在、テクニカル Wiki サイトの 2 番目のバージョンを作成中ですが、改善したい点の 1 つはデータベースの設計です。問題 (またはそう思う) は、各ドキュメントを表示するには、15 以上のテーブルを結合する必要があることです。使用したプログラマー、CPU、タグ、周辺機器、PCB レイアウト ソフトウェア、難易度など、各 wiki エントリに関連付けられた説明データを含むルックアップ テーブルがたくさんあります。
レイアウトの例を次に示します。
doc
--------------
id | author_id | doc_type_id .....
1 | 8 | 1
2 | 11 | 3
3 | 13 | 3
_
lookup_programmer
--------------
doc_id | programmer_id
1 | 1
1 | 3
2 | 2
_
programmer
--------------
programmer_id | programmer
1 | USBtinyISP
2 | PICkit
3 | .....
一部のドキュメント ID には、単一の属性 (プログラマーなど) に対して複数のエントリがある場合があるため、これを補うために DB を作成しました。programmer
他の 10 個の属性には、上記の 2 つのテーブルと同様のレイアウトがあります。1 つの文書記事を表示するために、約 20 のテーブルが結合されます。
特定の特徴を持つ記事を見つけるために、Sphinx 検索エンジンを使用しました。基本的に、Sphinx はすべてのデータにインデックスを付け (保存はしません)、提示されたフィルターに基づいて対象の wiki ドキュメント ID を返します。特定のプログラマーを使用する記事を見つけてから日付で並べ替えたい場合、MYSQL は最初にすべてのドキュメントを 2 つのプログラマー テーブルに結合し、次にフィルター処理を行い、最後に挿入時間で残りを並べ替える必要があります。一時テーブルで行われるため、フィルター処理された結果を並べ替えるのに役立つインデックスはありません (150k のドキュメント ID では長い時間がかかります)。ご想像のとおり、フィルタリングが必要なパラメータが増えると、すぐに悪化します。
それは、私がSphinxに頼らなければならないからです-特定のCPUとプログラマーを使用するすべてのwikiエントリを言う-現在のセットアップにはDBの匂いがあると私は信じています....
編集: [Entity–attribute–value モデル] を実装したようです1