2011-07-08 15 views
1

私はディレクトリ管理のようなテーブルを設計する必要があるプロジェクトに取り組んでいます。私はDBのほんの初心者なので、本当にあなたの専門知識が必要です。あなたはPARENT_IDは、独自のテーブルのPK IDを指している見ることができるようmysql DBの設計とクエリの最適化

id name  type  create_time  parent_id 
    1 folder1 folder  2011-2-3    
    2 folder2 folder  2011-2-3    1 
    3 folder3 folder  2011-2-3    1 
    4 folder4 folder  2011-2-3    1 
    5 file1  file  2011-2-3    4 
    .... 

:データベース設計のための私の現在の考えは以下のようにillustredすることができます。フォルダのような現実の世界での制約complysは、フォルダを含めることができ、ファイルは子供、などを持っていないことができます...

最も使用されるクエリのシナリオは次のようになります。id与え

  1. 、(そのすべてのサブファイルを検索しますインクルードフォルダとファイル)は、各ファイルについて、子があるかどうかを示します。 ID与えられた

  2. は、そのすべての祖先のID(両親、祖父母...)

が、大規模なアプリケーションを考慮見つけ、質問:

  1. あなたはスキーマ設計が合理的だと思います?そうでない場合は、お勧めします。
  2. これらの2つのシナリオでは、パフォーマンスに影響を与えないロボットクエリを作成するにはどうすればよいですか。任意のヘルプありがとうございます。

+0

parent_idが同じテーブルに対してFKの場合、0は使用できず、NULLである必要があります。 –

+0

書き込みたいクエリを特定し、where句で使用するのと同じ順序で同じ列にインデックスを作成します。 –

+0

それを尊重する必要はありません...私たちは1にしてみましょう – bingjie2680

答えて

0

parent_idを持つアーキテクチャは、すべての親ノードとすべての子ノードをリストするのには適していません。これを行うには再帰的な手順が必要です。

唯一の問題は、レコードを追加して、この記事http://www.sitepoint.com/hierarchical-data-database-2/に見てみましょう - しかし、正しいインデックスのトリガー

はダヴィデPirasの

+0

という記事が本当に便利です。私はこのアプローチをとって考えています。 'しかし、トリガーを介して簡略化することができますか?'これについて少し詳しく教えてください。あなたの答えをありがとう。 – bingjie2680

+0

トリガ(MySQL 5.0+) - テーブル上で何らかのkondの操作が実行されたときに呼び出されるプロシージャです - この場合、挿入時または更新時にトリガになります。トリガは左右のインデックスをすべて再計算します。でる – SergeS

1

からのコメントを参照してください経由してあなたがこの方法を検討することができます簡素化することができます。

id name  ----- type ---- create_time  parent_id 
    1 folder1 --- folder --- 2011-2-3    
    2 folder2 --- folder --- 2011-2-3  -----  1 
    3 folder3 --- folder --- 2011-2-3  -----  2-1 
    4 folder4 --- folder --- 2011-2-3  -----  3-2-1 
    5 file1 ----- file  ----- 2011-2-3 -----   4-3-2-1 

すべての祖先を示すparent_idに階層情報を入れます。

たとえば、フォルダ4の下に新しいフォルダを追加する場合は、 folder4のparent_id値に4-を付けて、新しいフォルダのparent_idにするだけです。

このように、すべての祖先を再帰的に見つける必要はありません。