- 締切済み
ファイルシステムを模したデータベースの設計について
Unix/Linux環境において、ファイルシステムを模したデータベースを設計しています。テーブルは大まかに、ユーザ情報、ユーザグループ情報そしてファイル情報の3つとなり、ユーザとグループの権限に応じて、ファイルの検索が出来るように作っています。PHPを通じて、検索結果を出力します。 今回ご相談したいのは、ファイル情報のテーブルです。ディレクトリの情報とファイルの情報を同じテーブルに入れようか、別なテーブルに分けた方がいいのか、悩んでいます。 テーブルを分けない場合だと、ファイル情報を検索する際、テーブルからファイル情報だけ抽出したテーブルと、同じテーブルからディレクトリ情報だけ抽出したテーブルをSQL関数でつなぐクエリを使えばいいのかなと考えています。 テーブルを分ける場合だと、ファイル情報テーブルとディレクトリ情報テーブルをSQL関数でつなげばいいのかなと思います。 どちらの方が効率がよい=ウェブサーバのリソースを抑えることができるのか、判断に苦しんでいます。相談に乗っていただけたら助かります。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- chukenkenkou
- ベストアンサー率43% (833/1926)
母体データ件数、ヒットするデータ件数、ソート要否、どういう操作中心かなどにより大きく話が違ってきます。 また、ディレクトリの階層は何階層にもなり得て、そこで既に自己結合が発生するのでは? また、オプティマイザなどは、MySQLのバージョンにより、話が全然違ってきます。
- chukenkenkou
- ベストアンサー率43% (833/1926)
>ディレクトリの情報とファイルの情報を同じテーブルに入れようか、 >別なテーブルに分けた方がいいのか 「ファイルの情報」とは、具体的に言ってどういうものですか? >ファイルシステムを模したデータベース との表題から推測すると、ファイルのデータそのものなのでしょうか? もしそうなら、一個のテーブルで管理するという発想は、普通はしないのでは? >テーブルをSQL関数でつなげば SQL関数でつなぐとは? >どちらの方が効率がよい=ウェブサーバのリソースを抑えることが >できるのか、判断に苦しんで もっと具体的な話がなければ、誰も具体的なアドバイスはできません。
補足
説明不足で申し訳ありません。 作ろうとしているのはウェブアプリケーションで、サーバのファイルシステムにあるファイルの情報をテーブルに格納、それに情報を追加(タグとか)、ログインユーザが自分の探すファイルを検索・表示できる仕組みです。 > との表題から推測すると、ファイルのデータそのものなのでしょうか? いいえ。ファイルそのものはファイルシステムに入ります。 DBにはそのファイルの情報、具体的には以下を入れようと考えています。 ・ファイル(ディレクトリ)のinode ・ファイル(ディレクトリ)名 ・ファイル(ディレクトリ)のあるディレクトリ ・ファイル(ディレクトリ)を作成したユーザID ・ファイル(ディレクトリ)の属するグループID ・ファイル検索用のタグ ・その他情報(サイズ、更新日など) ユーザがファイル/ディレクトリに操作を行う際、ユーザとファイルの属するグループに応じて操作を許可/拒否するように作りたいと考えています。簡単に説明すると ・ユーザ・ファイル・ディレクトリは共にグループに属する ・グループに属するユーザのみ、そのグループに属するファイル・ディレクトリに対して操作(追加・名前変更・削除・移動)を行うことができる 操作の許可/拒否を判定する際、ファイルの情報とディレクトリの情報を結合する必要が生じます。 > テーブルをSQL関数でつなげば ファイル情報テーブル(テーブルA)、ディレクトリ情報テーブル(テーブルB)として「SELECT xxx, yyy FROM テーブルA, テーブルB WHERE テーブルA.yyy = テーブルB.zzz」のことを言いたかったです。 1つのテーブルを利用する方法として自己結合を考えましたが、クエリ処理の中間にテーブルのキャッシュを発生させてサーバの負荷を上げてしまうのではないだろうか、と思いました。
お礼
具体的な説明が不足している中、相談に乗っていただき、どうもありがとうございました。ディレクトリ情報、ファイル情報ともにひとつのデータベースで扱うようにしてみたいと思います。完成にはまだ時間がかかりますが、その過程でまた相談に乗っていただけたらうれしく思います。 どうもありがとうございました。
補足
操作の中心は、ファイルの検索です。 ソート要因は、ファイル名、アップロードされた日付、ファイルサイズの昇順/降順。 母体データ件数は、アップロードしたファイル数によりますので何とも。しかし個人レベルでの利用なので、1万とかはないと思います。数千かと。 ヒットするデータ件数は、ユーザが任意で指定出来るようにするつもりですが、最大100件にしてページ送りをつけようと考えています。 ディレクトリの階層はいくらでも深く出来るようにしますが、確かに、ここで確実に自己結合が発生しますね。 MySQLのバージョンは4以上を予定してます。