2017-02-26 11 views
0

私はgdrive/dropboxのようなアプリケーションを、各ユーザーが使用できるグローバルに事前定義されたディレクトリ構造(変更不可能)で実装しました。カスタムフォルダの追加と管理)。データベース内の多くのユーザーの同じデータ

静的なディレクトリ構造は、現在の処理メカニズムに満足していないため、本当に満足していると思いますので、私には良いアドバイスを与えることができます。より良い。

現時点では、テーブル 'folders'を持つMySQLデータベースを使用していますが、その(驚き、驚き)にはすべてのフォルダ(定義済みとカスタム)が含まれています。したがって、フォルダ名、所有者、および親フォルダのフィールドがあります。

あらかじめ定義された構造が非常に大きいので、私はテーブルにすべてのユーザーのためにそれを追加したくなかったので、この構造のインスタンスが1つだけのフォルダテーブルをシードし、 "owner" 。したがって、ユーザーのすべてのフォルダを検索するには、この特定のユーザーを所有者として所有しているユーザーまたは所有していないユーザーを検索するだけです。

このアプローチはこれまでのところうまくいきますが、フォルダごとのユーザーごとの属性については、いくつかの大きな欠点があります。サブディレクトリを含む各ディレクトリのドキュメント数を表示したいと思います。これは毎回実際には遅い再帰クエリを使用して行われます。これは、ユーザーごとのフォルダ構造(たとえば、追加の「文書数」フィールドを追加するだけであれば、フォルダ内の文書に何かが発生したときにクエリフックを使用して更新できる構造)。

このデザインの選択についてどう思いますか?そのようにして、ユーザーごとのフォルダ属性(user_id、folder_id、document_count、last_modified、[その他のアトリビュート]など)を含むテーブルを追加するだけですか? (システムコマンドを利用して)システム上のフォルダを直接処理し、データベースからそれらを保持する方が良い方法でしょうか?それとも、もっと便利な方法でこれをどう管理することができるか、他のアイデアがありますか?

ありがとうございました! :-)

+0

複数のユーザーが特定のフォルダを使用できますか? –

+0

いくつのフォルダがありますか?ユーザーですか?ファイル?等? 〜について話してるの?何百万、またはちょうど何千もの。数千人にすぎないが、私は論理的な構造を構築することをお勧めします。何百万もの人にとって、実際のスキーマとクエリを見てみましょう。どちらのアプローチでも、パフォーマンスの低いクエリを記述することができます。_ –

答えて

1

私が正しく理解していれば、データベースにすべてのファイルを保存しています。だから、おそらくテーブルfiles(バイナリ)とそのフォルダIDが入っているでしょう。したがって、すべてのフォルダが名前にすぎないので、ユーザーはデータを構造化してアクセスを容易にすることができます。しかし、これはまた、これを再帰的なクエリでスキャンする必要があるデータベース内の階層構造にする必要はないことを意味します。

Aの中に固定フォルダAと固定フォルダBがあります。ユーザーは3つのフォルダを追加しました。ユーザーのいずれかを開いた場合、AとD:ユーザーが自分のストレージを開き

 
id folder_path user_id 
1  A    1   (every user has this) 
2  A/B   1   (every user has this) 
3  A/B/C   1 
4  D    1 
5  D/E   1 

場合、彼らはすべての主要なフォルダ(folder_pathでダッシュのないもの)を示している。これらは、ユーザーのfoldersテーブル内のレコードですフォルダは、Aと言う、あなたは(つまり、すべてのA/始まるとfolder_path内の1つのダッシュを持つ)内のすべてのフォルダを示しています。私たちのケースではA/B、プラスfolder_id 1を持つすべてのファイルのユーザーがFBの名前を変更した場合は、その後で始まるすべてのfolder_pathを変更代わりにA/Fで始まるA/B。ユーザーがFEの内部に移動した場合、A/B/Fで始まるfolder_pathをすべてD/E/Fで開始するように変更します。ファイルを数える

は同様に簡単です:

select count(*) 
from files 
where folder_id in (select id from folders where folder_path like 'A/B%'); 

これらのすべては、何が実際に移動しなければならないので、あなたは常にだけで、特定の文字列で始まるか、パスそのフォルダを検索したい、簡単な操作ですフォルダパスの開始を変更します。

+0

ありがとうございます! 申し訳ありませんが、私は明らかにしませんでした:はい、ドキュメントテーブルがありますが、ドキュメント自体は含まれていませんが、パス(フォルダデータベースの仮想パスとは関係ありません)がそれが参照しているファイルシステム。しかし、それはあなたの提案された解決策には関係ありません。これはまだ適用可能であり、少なくとも文書数の問題を解決するようです。これが本当にすべての要件を解決するならば、これをもっと徹底的に考える必要がありますが、現時点ではそうそうです。再度、感謝します! :-) – Tek

関連する問題