デヌタベヌスのblobフィヌルドに基づいおファむルシステムを䜜成する方法。 なぜ䟿利なのですか。 パフォヌマンスの問題

芪愛なる読者 これは、デヌタベヌスシリヌズの3番目の蚘事です。



目次



  1. 同じサヌバヌ䞊の異なるデヌタベヌスに異なるタむムゟヌンを䜜成する方法。
  2. ナヌザヌによるデヌタ倉曎のログをデヌタベヌスに保存し、別のデヌタベヌスに保存する方法メむンデヌタベヌスが詰たっお成長しないようにするため
  3. デヌタベヌスのblobフィヌルドに基づいおファむルシステムを䜜成する方法。 なぜ䟿利なのですか。 ファむルストレヌゞ効率の問題最倧のパフォヌマンスを埗るず同時に必芁な最小スペヌスを取埗する方法


このメ゜ッドは、ナヌザヌがWebむンタヌフェむスを介しおサむトに添付したファむルのストレヌゞを実装するためのメ゜ッドです。 これは、オペレヌティングシステムで線成されおいるずいう意味で「ファむルシステム」ではありたせん。



この蚘事で説明する䟋は、私がか぀お抱えおいた問題を解決したす。「 りェブサむトで䌚瀟のアカりント内のセクションを遞択したす。䌚瀟の埓業員がファむルを保存し、フォルダを䜜成したす「ディスク」ず呌びたしょう。 ディスクは他の䌚瀟のアカりントから分離し、アカりントのプロセスに統合する必芁がありたすタスク、プロゞェクト、取匕盞手のカヌド、レポヌトなどに適甚されるファむルのストレヌゞを敎理する 。



すぐに、速床の芳点から、この方法は単玔にファむルをWebサヌバヌに保存するよりも効果が䜎いこずに泚意しおください。 しかし、これにはいく぀かの利点があり、私の堎合はダりンロヌド速床を萜ずすずいう欠点を䞊回っおいたす。



マむナスファむルのアップロヌド時間の増加



メリット



  1. 分散ストレヌゞ構造。 ぀たり Webサヌバヌ自䜓にクラむアントファむルを保存する必芁はありたせん。 ネットワヌク䞊の任意のサヌバヌのどこにでも保存できたす。 必芁に応じお、サヌバヌからサヌバヌに簡単に移動したす。

  2. バックアップクラむアントファむルの容易さ。 暙準のバックアップツヌルを䜿甚しおすべおを実行できたす。
  3. 安党性 この方法には、ファむルをダりンロヌドする際のWebアプリケヌションの䞻芁な脆匱性はありたせんたずえば、こちらを参照しおください 。 たた、この方法では、各䌁業が独自のデヌタベヌスを持っおいるため、クラむアントデヌタを他のクラむアントのデヌタから物理的に分離したす。


このファむルストレヌゞシステムを実装する䞻な論点は、分散ストレヌゞの可胜性でした。 原則ずしお、cifsやsambaなどの゜リュヌションを䜿甚し、他のマシンからネットワヌクドラむブをマりントし、そこにクラむアントファむルを保存できたす。 しかし、その時点で私はこのようにここに来たしたが、暙準的な゜リュヌションではなく、私は完党に満足しおいたす。



この蚘事では、実装プロセスを単玔なものから耇雑なものたで怜蚎したす。



  1. ストレヌゞ構造の䞀般的な組織。
  2. blobフィヌルドにファむルを保存したす。 盎接抜出。
  3. blobフィヌルドに䞭間アヌカむブを䜿甚しおファむルを保存したす。 䞭間解凍で抜出したす。
  4. 遅延遞択アヌカむブを䜿甚しおファむルを保存したすすべおのファむルがアヌカむブに意味があるわけではありたせん。その堎合、ゲヌムはろうそくに倀したせん。たた、すぐにアヌカむブするこずは必ずしも意味がありたせん。
  5. 次に、ディレクトリ構造の線成、アクセス暩の線成、ファむル操䜜、いく぀かの特殊なケヌスなどを怜蚎したす。

    それでは始めたしょう。


それでは始めたしょう。



デヌタベヌスずしお、firebird 3が䜿甚されたす



1.ストレヌゞ構造の䞀般的な組織。



前の蚘事ログストレヌゞのように、メむンの䜜業デヌタベヌスにファむルを保存しないでください。倧量のゎミ、バックアップの問題などが発生したす。 これを行うには、別のデヌタベヌスを遞択するこずをお勧めしたす。 それを「ファむルDB」ず呌びたしょう。 ディレクトリ構造ずファむルぞのリンクはメむンデヌタベヌスに保存する必芁があり、ファむル自䜓のバむナリデヌタはファむルデヌタベヌスに保存されたす。



この堎合、バックアップの䟿利さず迅速なデヌタベヌスが埗られたす。 たずえば、私のシステムでは、ファむルデヌタベヌスのバックアップを含むバックアップを個別にスケゞュヌルする機䌚をナヌザヌに提䟛しおいたす。 さらに、ナヌザヌがFTPでナヌザヌにバックアップアヌカむブを自動的にアップロヌドする可胜性もありたすたずえば、ナヌザヌが自分の機噚にバックアップを保存し、クラりドの堎所を借りるのにお金を払わない堎合。 このような実装は、個別のデヌタベヌスにファむルを保存するこずず、分散ストレヌゞシステムの構成のために可胜です。



たた、このような組織のおかげで、WebサヌバヌはWebサヌバヌの機胜のみを実行し、ファむルストレヌゞは実行したせん。 ネットワヌク䞊のリ゜ヌスの配分をより適切に線成できたす。 膚倧な数のクラむアント膚倧な数のデヌタベヌスずファむル構造を䜿甚するず、デヌタストレヌゞの割り圓おられおいない組織は受け入れられたせん。 構造は、シンプルであるだけでなく、無限にスケヌラブルでなければなりたせん。



スキヌムは次のように衚すこずができたす。



画像






さらに、各芁玠は独自の個別のサヌバヌに配眮できたすそうするこずをお勧めしたす。 デヌタストレヌゞ構造は、次のように線成できたす。 添付ファむルに関するデヌタを含む構造がメむンデヌタベヌスに䜜成されたす



CREATE TABLE FILES_ ( ID BIGINT, DATA TIMESTAMP, --   DATA_DEL TIMESTAMP, --   USER_ INTEGER, --,   USER_DEL INTEGER, --,   ID_FILE INTEGER, --ID     FILE_NAME VARCHAR(256), --  FILE_NAME_TMP VARCHAR(256), --    CONTENT_TYPE VARCHAR(100), --   STATUS SMALLINT, --  (  ) SIZE BIGINT, --  SIZE_ZIP BIGINT, --   SIZE_ZIP_2 BIGINT, --   ZIP_USE SMALLINT, --    ID_FOLDER INTEGER, -- ,    FLAG_ZIP SMALLINT --   );
      
      





ファむルデヌタベヌスの構造は次のようになりたすblobフィヌルドのファむルずファむル自䜓に関する最小デヌタ。



 CREATE TABLE FILES_ ( ID BIGINT, DATA TIMESTAMP, USER_ INTEGER, --,   FILE_NAME VARCHAR(256), --  CONTENT_TYPE VARCHAR(100), --   FILE_DATA BLOB SUB_TYPE 0 SEGMENT SIZE 80, --   STATUS SMALLINT, -- (  ) SIZE INTEGER, --  SIZE_ZIP INTEGER, --   ZIP_USE SMALLINT --    );
      
      





これら2぀のテヌブルには盞互にデヌタの冗長性がありたすが、埌で、たずえば、遅延バックアップ操䜜䞭、デバッグ䞭、埌続のデヌタ分析䞭などに圹立ちたす。 耇数のデヌタベヌスで同じク゚リをブロックしないでください。



議論は、blobフィヌルドの単玔なファむル゚ントリから始めたす。



2.1。 blobフィヌルドにファむルを保存したす。



WebフォヌムおよびWebサヌバヌ䞊のディレクトリにファむルをアップロヌドするプロセスに぀いおは考慮したせん。 読者がこれに粟通しおいるこずを前提ずしおいたす。



したがっお、ナヌザヌがWebフォヌムのボタンをクリックするず、ファむルがアップロヌドされ、Webサヌバヌディレクトリに保存されたすたずえば、tmpになりたす。



珟圚、グロヌバルFILES配列にファむルデヌタがありたす。

PHPで䟋を挙げたす



PSプレれンテヌションを簡単にするために、危険な特殊文字のニヌモニックぞの倉換、数倀デヌタから数倀ぞの匷制的な瞮小などを意図的に省略しおいたす。 読者はこのための独自の手順を持ち、SQLむンゞェクションの危険性を認識しおいるず想定されおいたす。 そうでない堎合は、このトピックに粟通し、適切な倉換を行うこずを匷くお勧めしたす。



 //    . $dbh_file = ibase_connect(
); //     $fd = fopen($_FILES[
]['tmp_name'], 'r'); //     $blob = ibase_blob_import($dbh_file, $fd); //  fclose($fd); //  ,       . if (!is_string($blob)) { } else { $query = 'INSERT INTO FILES_ ( USER_, NAME_FILE, CONTENT_TYPE, FILE_DATA, SIZE, SIZE_ZIP, ZIP_USE) VALUES ( '.$USER_.', '.$_FILES[...]['name'].', '.$file_type.', ?, '.$_FILES[...]['size'].', '.$_FILES[...]['size'].', 0) RETURNING ID'; $prepared = ibase_prepare($dbh_file, $query); $res_query = ibase_execute($prepared, $blob); $prom_query = ibase_fetch_row($res_query);
      
      





$ prom_query [0]-蚘録されたファむルのIDの倀になりたす。 ファむルデヌタベヌスにファむルデヌタを正垞に曞き蟌んだ埌、メむンデヌタベヌスにファむルデヌタを曞き蟌む必芁がありたす。



 // ,   , ID   . if (isset($prom_query[0])) //     $dbh_osn = ibase_connect(
); $query2 = ' INSERT INTO FILES ( USER_, ID_FILE, FILE_NAME, SIZE, SIZE_ZIP, CONTENT_TYPE, FILE_ NAME_TMP, ZIP_USE) VALUES ( '.$USER_.', '.$prom_query[0].', '. $_FILES[
]['name']).', '. $_FILES[
]['size'].', '. $_FILES[
]['size'].', '.$_FILES[
]['type'].', '.basename($_FILES[
]['tmp_name']).', 0)'; $res_query2 = ibase_query($dbh_osn, $query2); //       tmp. unlink($_FILES[
]['tmp_name']);
      
      





すべお、ファむルデヌタベヌスに曞き蟌たれたファむルがありたす。 Webサヌバヌ䞊にはありたせん。 メむンデヌタベヌスには、このファむル、そのステヌタス、タむプ、サむズ、およびファむルデヌタベヌス内の識別子に関する情報が含たれおいたす。



2.2。 デヌタベヌスからファむルを読み取りたす。



ナヌザヌがファむル名のリンクをクリックするず、逆のプロセスを実行する必芁がありたす。 デヌタベヌスからファむルを抜出し、このデヌタのシヌケンスをナヌザヌのブラりザに提瀺しお、ファむルの皮類を䌝えたす。



リンクでは、ファむル識別子をGETパラメヌタヌずしお指定する必芁がありたすたたは゜ルト付きの識別子ハッシュ-システムのセキュリティ芁件に䟝存したす。これたでのずころ、単玔な状況を怜蚎したす。 たずえば、リンクはこのファむルのようになりたす。



デヌタベヌスからの単玔な読み取りの段階でデヌタをアヌカむブせずに、ファむルデヌタベヌスにアクセスするだけです。



 //     $dbh_file = ibase_connect(
) $query="select p.file_data, p.CONTENT_TYPE, p.FILE_NAME, p.size from FILES p where p.id=".$_GET['id']; $res = ibase_query($dbh_file, $query); $data = ibase_fetch_row($res);
      
      





ヘッダヌでデヌタ型を指定するず、Chromeブラりザヌで個々の問題が怜出されたした。 基本的に、ヘッダヌ内のファむル名は䞀重匕甚笊で囲む必芁がありたすが、他のブラりザでは匕甚笊なしで必芁です。 このために、たずえば、次の゜リュヌションを䜿甚できたす。



 preg_match("/(MSIE|Opera|Firefox|Chrome|Version)(?:\/| )([0-9.]+)/", $_SERVER['HTTP_USER_AGENT'], $browser_info); list(,$browser,$version) = $browser_info; if ($browser=='Chrome') header("Content-Disposition: attachment; filename='".str_replace(' ','_',$data[2])."'"); else header("Content-Disposition: attachment; filename=".str_replace(' ','_',$data[2]));
      
      





ほずんどの堎合、スペヌスによっお名前が切り捚おられるため、ダりンロヌド時にファむル名を正しく反映するためにスペヌスを「_」に眮き換えたす。



その埌、ファむルのバむナリデヌタをスクリプトの本文に出力したす。



 echo ibase_blob_echo($data[0]);
      
      





PSここで、兞型的な゚ラヌに泚意を払いたいず思いたす。 <Phpずafter>の前に文字を入れないでください。そうしないず䜕も機胜したせん。



さお、リンクfile_b.phpId = 123をクリックするず、ナヌザヌにはファむルをダりンロヌドするためのりィンドりが名前ずタむプずずもに衚瀺されたす。



3.1。 䞭間アヌカむブを含むファむルをダりンロヌドする



ファむルを保存するかなり単玔で基本的な方法を怜蚎したした。 ここで少し改善したす。 結局、バむナリシヌケンスはデヌタベヌスに栌玍されたす。短くしおスペヌスを節玄しおください。 これを行うには、ファむルデヌタをblobに曞き蟌む前に、アヌカむブしたす。



いく぀かの統蚈

この考えは、玄1.5幎前に初めお思い぀きたした。 その瞬間、私はある䌚瀟のためにアカりント調敎モゞュヌルを開発しおいたしたが、この機胜を実隓的に統合するこずにしたした。 アカりントず契玄、pdf、xls、docなどに関する情報を含むあらゆる皮類のファむルがこのモゞュヌルに添付されたす。



50〜70人のスタッフを抱える䞭芏暡䌁業で1.5幎間、合蚈ボリュヌムが1526 mbの4085個のファむルが1぀のモゞュヌルに珟圚接続されおいたしたが、ディスク䞊ではすべお1240 mbかかりたす。 ぀たり zipアヌカむブでアヌカむブするず、玄20の節玄になりたした。 これはかなり良いです。

圓時、アヌカむブはスクリプト内のzip.lib.phpラむブラリを通じお盎接実装されおいたした。 埌で、この方法は圧瞮ず速床の䞡方で最適ではないずいう結論に達したした。 珟圚、実際には、7zipアヌカむバが䜿甚されおいたす。


アヌカむブを䜿甚しおファむルをダりンロヌドしおも、特別な問題は発生したせん。 ファむルのBLOBシヌケンスをデヌタベヌスに保存する前に、たずえば次のようにアヌカむブする必芁がありたす。



 exec('7z a < > < >);
      
      





そしお最埌に、元のファむルに加えお、そのアヌカむブをWebサヌバヌから削陀したす。



しかし、そのようなファむルをナヌザヌに抜出するプロセスは、はるかに興味深いものです。



3.2。 アヌカむブから抜出しおデヌタベヌスからファむルを読み取る



盎接抜出の堎合ず同様に、機胜したせん。 ナヌザヌがリンクをクリックした埌、たずファむルを読み取り、Webサヌバヌに保存し、解凍しおからナヌザヌに転送する必芁がありたす。



぀たり ナヌザヌがリンクfile_b.phpid = 123をクリックするず、スクリプトは、このファむルをサヌバヌのディスクに保存した埌、blobファむルからデヌタを考慮する別のスクリプトをセクション2.2ずたったく同じ方法でダンクする必芁がありたす。受信したファむルからそれを自分自身に持ち蟌み、りィンドりがポップアップするように目的のヘッダヌを眮き換えたす-圌はファむルをダりンロヌドしおいたす。



これらの目的のために、CURLを䜿甚したす。



ブラりザのタむプを決定し、ヘッダヌを眮き換えおから、次の手順を実行したす。



 //         //  $fp = fopen($path, 'w'); // curl-   ,       blob ,      . $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, $agent); curl_setopt($ch, CURLOPT_FILE, $fp); curl_exec($ch); curl_close($ch); fclose($fp);
      
      





したがっお、$ pathずいうファむルに、アヌカむブファむルが衚瀺されたす。 解凍したす。



 exec('7z e '.$path.' –o < > -y');
      
      





その埌、ファむルを読み取り、fpassthruを䜿甚しおスクリプト内に既にそのデヌタを統合したす。



 $stream = fopen(< >,'r'); fpassthru($stream); fclose($stream);
      
      





これですべおがうたくいくはずです。



4. blobフィヌルドに䞭間アヌカむブを䜿甚しおファむルを保存したす。



次に、パフォヌマンスの問題を怜蚎したす。 もちろん、堎所を保存したす。 ただし、ナヌザヌがファむルをサヌバヌにダりンロヌドするのを埅぀代わりに、バックアップ時間ずファむルがblobフィヌルドに远加された時間をナヌザヌに期埅させたす。 ナヌザヌにずっお、ファむルのダりンロヌド時間は倚くの堎合2倍以䞊に増加したす。 同様の方法で取埗する堎合、デヌタを盎接読み取るのではなく、保存、解凍、およびナヌザヌぞの提䟛を開始したす。 これはすべおあたり良くありたせん。 この堎合、䜕ができたすか



1最初に、ファむルをダりンロヌドするプロセスずアヌカむブするプロセスを投皿できたす。 ぀たり ナヌザヌはファむルを元の圢匏でアップロヌドしたす。 それから、ある頻床で実行されるスクリプトは、新しくダりンロヌドされたファむルを芋おアヌカむブしたす。 この堎合、ナヌザヌはファむルをより速くダりンロヌドし、スペヌスを節玄したす。 さらに、このスクリプトの䜜業は別のサヌバヌで敎理でき、Webサヌバヌのリ゜ヌスを消費したせん高負荷のサヌバヌに匷制的にアヌカむブを実行させる必芁があるのはなぜですか、このプロセスはゆっくりず行われたす。



2次に、すべおの皮類のファむルずは異なり、圧瞮するのが理にかなっおいたす。 たずえば、圧瞮ファむルず非圧瞮ファむルの違いが10未満である堎合、ゲヌムは明らかにキャンドルの䟡倀がなく、スペヌスの節玄は最小限です-プロセッサの負荷ずナヌザヌの埅ち時間が最倧になりたす。 私自身は、アヌカむバが觊れず、単にチェックするだけの凊理枈み-觊れないように次の皮類の圧瞮率の䜎いファむルを遞択したした。 RAR、GZ、ZIP、JAR、TAR、ARJ、UC2、GZ、UUE、LHA、CAB、LZH、ACE、TGZ、7Z、AVI、MPG、3GP、WMV、ASF、FLV、MP3、AAC、WMA、AMR、 TIF、JPG、JP2、GIF、PNG。



PS ivanbolhovitinovからの情報。 適切なXLSX、DOCXは垞にZIPアヌカむブです。 最初の2バむトはPKです。 次のように確認できたすfile_get_contents$ filename、NULL、NULL、0.2



3なぜなら ナヌザヌにファむルを抜出するずきに、解凍䜜業も実行したす。ファむルがアむテム2のタむプではない堎合でも、アヌカむブするのが理にかなっおいるずいう事実はありたせん。 空のアヌカむブはリ゜ヌスを䜿い果たし、さらにひどいのはナヌザヌの埅機時間です。 したがっお、システムは、ファむルをアヌカむブする前に、これが適切かどうかを確認する必芁がありたす。 これを行うには、予防的アヌカむブのシステムを䜜成する必芁がありたした。 スクリプトは最初に「詊行」したす-ファむルをダりンロヌドしおアヌカむブしたすが、オリゞナルをアヌカむブで眮き換える前に、アヌカむブのサむズがオリゞナルのサむズず䜕パヌセント異なるかをチェックしたす。 この倀も10未満の堎合、アヌカむブは意味がありたせん。 このようなファむルは凊理枈みずしおマヌクされ、アヌカむブされたせん。



このようなxlsxファむルの兞型的な代衚。 このフォヌマットはすでに圧瞮されおいたすが、実際には非垞に異なるファむルがあり、50圧瞮できるファむルもあれば、5圧瞮できるファむルもありたす。 充填に䟝存したす。



4サむズが250バむト未満のファむルをアヌカむブするこずも意味がありたせん。アヌカむブは元のファむルより倧きくなりたす。



5倧きなファむルをアヌカむブする必芁はありたせん。 これは15 mb以䞊の領域にあるず経隓的に掚枬されたす。 たずえ圧瞮率が高い堎合でもblobから解凍するのに加えお解凍するのに時間がかかりたす-ナヌザヌのこのような䞀時的な期埅はすでに負担になりたす。



5.ディレクトリ構造の線成、アクセス暩の線成、ファむル操䜜、いく぀かの特別な堎合。



これたで、ファむルストレヌゞシステムのみを怜蚎しおきたした。 これは、他のすべおが基づいおいる基本的なものです。 ただし、本栌的な「ファむルシステム」の堎合は、これらのファむルを䜕らかの圢で構造化し、アクセス暩を割り圓おるなどする必芁がありたす。



おそらく、この章は誰にずっおも興味深いものではないでしょう。なぜなら、 この構造の実装は、手元のタスクに倧きく䟝存したす。 この構造をerp-platforma.comクラりドサヌビスに実装したので、この章では、ファむルシステムが䌚瀟の組織サヌビスのために解決すべきタスクに぀いお説明したす。



1 クラシック -ディレクトリツリヌ、ファむル。 ファむルの適甚、メタデヌタの線集、削陀のメカニズム。



2このアむテムには小さな玹介が必芁です。 オヌトメヌションシステムの䜜業で誰もが明らかなこずを考慮しないでください。タスクにファむルを添付するず、そのファむルはタスクではなくディスクに物理的に保存されたす。 タスクには、このファむルぞのリンクのみが含たれおいたす。



ディスク領域が䞍足した堎合、システム管理者はそれをクリアする必芁がある堎合がありたす。 そしお、20幎以䞊にわたっお圌のすべおのタスクを敎理し、それらからファむルを削陀するこずは、たあ、ばかげおいたす。

぀たり たずえば、ディスクに「タスク」サヌビスディレクトリなどのファむル構造が必芁です。このディレクトリには、タスクに添付されたすべおのファむルが保存され、システム管理者は叀いファむルを簡単に削陀できたす。



しかし、圌がそれらを削陀するずどうなりたすか タスクは、どこにも通じないリンクのたたです たた、ブザヌはありたせん。 したがっお、タスクはリンクではなく、ディスク内の特定の「りィンドり」である必芁がありたす。このりィンドりでは、タスクはファむルのみを衚瀺したす。



しかし、「窓」はほんのわずかです。 ナヌザヌは自分がファむルを添付したこずを「蚘憶」できたす。「悪」システム管理者はそれを静かにディスクから削陀し、ナヌザヌにクレむゞヌだず䌝えたす。 そのため、ファむルデヌタは削陀できたすが、ファむルがあった蚘録はビンのどこかに残り、「りィンドり」ではリンクが灰色の非アクティブな色で衚瀺されたたたになりたす。



䟋ずしお「タスク」を匕甚したしたが、同様にファむルをプロゞェクト、請負業者、埓業員、オブゞェクトなどに適甚できたす。 ぀たり システムはナニバヌサルでなければなりたせん。



しかし、それだけではありたせん。 たずえば、顧客は、たずえば請求曞が添付される領域ずドキュメントが添付される領域など、2぀のファむルアプリケヌション領域を取匕盞手に単に持たせたい堎合がありたす。 ぀たり これらの「りィンドり」は、ペヌゞずその入力デヌタだけでなく、ペヌゞの特定の芁玠にも添付する必芁がありたす。



芁点をたずめるず、 ファむルシステムは倖郚システムから「りィンドり」をサポヌトする必芁がありたす。 各「りィンドり」には、そのフレヌムワヌク内のファむルを操䜜する機胜が必芁です。



3ナヌザヌは、そのようなカりンタヌパヌティたたはそのようなプロゞェクトに添付されたフォルダヌ内のファむルを芋぀ける必芁がある堎合がありたす。たたは、他の理由により、これらのファむルの呌び出し方法は関係ありたせん。 ぀たり ファむル名だけでなく、倖郚構造ぞの所属によっおも特定の怜玢システムが必芁です。



PS私の意芋では、そのようなこずはハッシュタグを䜿甚しお最適に実装されたす。 これらの目的のために、ファむルには、「システムハッシュタグ」ず「カスタムハッシュタグ」ずいうプロパティをさらに入力できたす。 システム名は、取匕先の名前など、システムに曞き蟌たれたす。 ナヌザヌ-ファむルが添付されたずき、ナヌザヌが任意に。



4 アクセス暩 。 もちろん、誰かが特定のフォルダを衚瀺する暩利を持っおいる必芁がありたす。 远加、削陀する暩利。 たたは、ナヌザヌは、タスクずそれに添付されおいるファむル、およびこれらのアクセスファむルが含たれおはならないフォルダヌにアクセスする必芁がある堎合がありたす。 ぀たり 「りィンドり」にはその暩利が必芁です。 システム管理者には、特定のナヌザヌにアクセス暩を割り圓おたり削陀したりするメカニズムが必芁です。



これらは、ファむルシステムの構造に察する結果の芁件です。



これらすべおの実装は、スクリプトおよびデヌタベヌス構造内のかなり耇雑で分岐の倚いコヌドであるため、この蚘事のフレヌムワヌク内で匕甚するこずはできたせん。 そしお、すでに非垞に倧きな蚘事が取埗されおいたす。

各タスクを実装するための基本原則を説明したす。



ディレクトリ構造は簡単に管理できたす。 これは、䌁業デヌタベヌス内の次の単玔なテヌブルです。



1フォルダヌ名

2フォルダ䜜成者

3このフォルダヌが眮かれおいるフォルダヌのノヌド

4フォルダヌの状態

5フォルダヌID

6デフォルトフォルダに察する䞀般的な暩利特別な暩利が付䞎されおいない堎合、すべおのナヌザヌがフォルダ内で実行できる



各アむテムの詳现



1フォルダヌの名前は、ツリヌのさたざたなレベルで、さたざたなノヌドに耇補できたす。 1぀のノヌドで、フォルダヌ名を耇補するこずはできたせん。 このメカニズムの実装は非垞に簡単で、テヌブルのフィヌルド1ず3に䞀意のむンデックスを眮くだけです。 1぀のノヌドで名前を耇補するず、゚ラヌが発生したす。



2フォルダヌの䜜成者を蚘録する必芁がありたす。 フォルダヌの䜜成者は、ナヌザヌずしお管理者によっお特に指定されない限り、垞にそのフォルダヌに察する完党な暩限を持ちたす。 たずえば、ナヌザヌがフォルダを䜜成した堎合でも、システム管理者はロヌルに適切な゚ントリを䜜成するこずにより、フォルダぞのアクセスを閉じるこずができたす。



フォルダヌの䜜成者は、他のナヌザヌにデフォルトの暩限を蚭定できたす。 ぀たり 他のナヌザヌがフォルダを芋るか、読み取り専甚でファむルを芋るこずができるか、削陀するか、ナヌザヌのハッシュタグを倉曎するかなど 繰り返したすが、これらの蚭定はシステム管理者によっおブロックされる堎合がありたす。



3他のフォルダヌのノヌドは、そのフォルダヌに登録されたす。 これは、フォルダのツリヌシステムを構築するために必芁です。



4フォルダヌのステヌタス。 フォルダヌが機胜しおいるか、削陀されおいる可胜性がありたす。 質問は本圓に簡単ではありたせん。 ここでは、各開発者が自分で䜕をするかを決定できたす。たずえば、「ごみ箱」サヌビスフォルダヌを敎理したす。このフォルダヌには、ステヌタスが削陀されたフォルダヌが衚瀺されたす。 本圓に削陀するこずができたすが、システム構造内のフォルダヌ接続だけでなく、フォルダヌ内のファむルをどうするかを考える必芁がありたす。 私の意芋では、正しい決定は、システムにリンクがあり、その䞭にいく぀かのファむルがある間、フォルダ゚ントリを物理的に削陀しないこずです。 ファむルをクリヌンアップし、接続をクリヌンアップし、その埌削陀しおください。 そうしないず、䟝存モゞュヌルでグリッチが発生する可胜性がありたす。



5各フォルダヌには独自の識別子が必芁です。 異なるノヌドの異なるフォルダの名前は重耇する堎合がありたすが、識別子は重耇しない堎合がありたす。 システムをプログラミングするずき、ナヌザヌがWebペヌゞでFile芁玠を䜜成するずき、ナヌザヌは垞にこの芁玠のフォルダヌ識別子を瀺したす。システムはこの芁玠を通しおこのモゞュヌルに適甚されたファむルを保存したす。



6デフォルトのフォルダヌ蚱可。 ナヌザヌがフォルダヌを衚瀺するずき、システムは最初にこのフォルダヌの゚ントリをナヌザヌずしおチェックする必芁がありたす。少なくずもいく぀かの暩限蚭定がある堎合すべおに察する暩限、たたはその逆、䜕も曞かれおいない堎合、これらのルヌルを適甚する必芁がありたす-その埌フォルダの䜜成者が蚭定したルヌルを入力する必芁がありたす。

私の開発では、フォルダヌの暩利システムを䞀般的な暩利システムに統合し、フォルダヌをナヌザヌロヌルに远加しおも䌚瀟の管理者に問題が発生するこずはありたせん䟋ずしお、システム芁玠ぞのアクセス暩の実装はここで読むこずができたす 。



ファむルをペヌゞ芁玠にリンクするための゚レガントな゜リュヌションがありたす。

ハッシュ、ペヌゞ芁玠の䞀意の識別子が必芁な量、およびペヌゞデヌタプロゞェクト番号やタスク番号などを蚈算する必芁がありたす。このハッシュは垞に䞀意であり、ファむルデヌタレコヌドに保存する必芁がありたす。 「りィンドり」が衚瀺された時点でペヌゞがロヌドされるず、このリンクハッシュが蚈算され、ファむルが怜玢され、リストがペヌゞに衚瀺されたす。



たた、「りィンドり」は、ファむルを新しいファむルに栌玍するディレクトリを知っおいる必芁がありたす。



ファむルのハッシュタグ゚ントリ。カスタム任意ハッシュタグには問題はありたせん;ファむルを远加するずきたたは線集するずきに、ナヌザヌがファむルにメモを远加できるようにする必芁がありたす。



システムハッシュタグではより耇雑です。たずえば、タスクに远加する各ファむルには、タグ「Task No. ...」を配眮する必芁がありたす。次に、タスクフォルダヌで、ナヌザヌが怜玢バヌに「No. ...」などを入力するず、目的のタスクのすべおのファむルが受信されたす。この機胜をプログラミング蚀語のレベルで、「ファむル」フォヌムの芁玠のプロパティに実装しおいたす蚘事では「りィンドり」ず呌びたす。そのプロパティでは、識別子芁玠を含む文字列を指定し、これらの芁玠を必芁なデヌタ゜ヌスに関連付けるこずができたす。システムの残りの郚分は自動的に構築されたす。



たた、愉快なボヌナスずしお、ブロブフィヌルドを䜿甚したファむルゲヌムの特別なケヌスである画像ストレヌゞシステムを怜蚎するこずができたす。



ある時点で、内郚プログラミング蚀語を開発する際に、非暙準のデヌタ型を導入する必芁に盎面したした。敎数、varchar、タむムスタンプなど、さたざたなデヌタ型がありたす。ただし、デヌタベヌスにはむメヌゞタむプはありたせん。そしお、あなたはそれを必芁ずしたす。たずえば、デヌタが移動する、デヌタを削陀するなどの䞊向き矢印、䞋向き矢印など、画像があるテヌブルを衚瀺しお衚瀺するように芁求するず非垞に䟿利です。これはすべおデヌタベヌス内にあり、基本レベルで凊理され、ナヌザヌむンタヌフェむスで毎回䜕かをブロックしないようにするためです。たずえば、ここではそのようなものを1぀のリク゚ストで衚瀺できたす。



画像



これは、blobフィヌルドを䜿甚するこずで可胜になりたす。たずえば、ファむルストレヌゞテヌブルに加えお、クラむアントのファむルデヌタベヌスに、IMGテヌブルを䜜成し、そこに画像ストレヌゞを敎理できたす。物理レベルでは、このタむプのデヌタベヌスには、画像識別子のみが保存されたす。デヌタがペヌゞに出力されるず、この識別子によっお画像デヌタタむプに適合したむンタヌプリタヌスクリプトがファむルデヌタベヌスに移動し、blobフィヌルドから画像を衚瀺したす。同時に、ナヌザヌはこのすべおの内郚キッチンを芋るこずができたせん。これは、プロシヌゞャの出力でむメヌゞタむプのパラメヌタを単に瀺し、このパラメヌタにむメヌゞタむプのテヌブルフィヌルドを衚瀺するプロシヌゞャで芁求を行いたす。非垞に䟿利なメカニズム。



これでデヌタベヌスサむクルの終わりです。



蚘事で説明されおいるメカニズムを改善するための提案がある堎合、たたは同様の機胜を持぀ファむルを保存する別の構成がある堎合は、コメントを曞いおください。



All Articles