私が働いている場所に気づいたのは、人々がファイル名に情報を保存し、ファイル名を解析することに熱心だということです。
私にとってこれは特に良い習慣ではないようです。スクリプトがファイルをグロッビングし、別のファイルが最初に一致するため間違ったスクリプトを取得するという問題が既に発生していることを確認しました。
それは悪い習慣と見なされますか?
ある種のメタデータに基づいてファイルシステムからファイルを取得するために受け入れられている他のソリューションは何ですか?
私が働いている場所に気づいたのは、人々がファイル名に情報を保存し、ファイル名を解析することに熱心だということです。
私にとってこれは特に良い習慣ではないようです。スクリプトがファイルをグロッビングし、別のファイルが最初に一致するため間違ったスクリプトを取得するという問題が既に発生していることを確認しました。
それは悪い習慣と見なされますか?
ある種のメタデータに基づいてファイルシステムからファイルを取得するために受け入れられている他のソリューションは何ですか?
回答:
はい、それは悪い習慣だと思います。長さの制限、エンコードの問題、重複データによる競合など、あらゆる種類の問題が発生します。
ベターは、メタデータとファイルへのパスを含む「マスターファイル」(マニフェストまたはインデックスと呼ばれることもあります)を使用することです。または、データベース、レジスターなどに似たもの。または、実際のファイル内に、たとえばJSONやXMLのファイルに含まれるデータ構造の最上位にメタデータを配置します。
これは、情報を格納する概念、またはキー値ストアに名前空間キーを置くという概念にやや似ています。名前空間にのみ使用してクイックルックアップを行う限り、これは大丈夫だと思います。キーコンポーネントは解析可能な情報を提供するために存在しません。その情報が必要な場合は、値に複製します(上記の場合はファイル)。
まず、メタデータはぼやけた概念です。
ただし、ファイル内のメタデータの多くのケースはすでに存在します。
それにもかかわらず、その短いリストは慣行を支持する議論ではありません。
代替手段は次のとおりです。
データベースが必要なようです。
ユーザー名をファイル名に含めることには、多くのセキュリティ上の問題があります。各ユーザーのファイル( "username.txt")があるとします。誰かがユーザー名「../../../../etc/passwd」を登録するとどうなりますかは、ユーザー入力のフィルタリング方法によって異なります。
データベースフレームワークは、ユーザー入力のサニタイズに役立つ場合があります。
いいえ...まあ..必ずしもそうではありません。
厳密な規則と一般的な解析および検証手段(スクリプト、ライブラリなど)がすぐに利用できる限り、準備は万端です。
パッケージングと依存関係管理システム(Maven、NuGetなど)を例にとってみましょう。多くの場合、メタデータに特定のファイルを使用してより高度な情報を保存しますが、多くの場合、基本情報はファイル名自体の一部です。厳密な規則に基づいて、ファイル名にはパッケージに関する最も適切な情報を含めることができます。それはベンダー、名前、バージョン、タイプです。必要なのはそれだけかもしれません... 4つまたは5つの短い情報。
メタデータが単純な場合、ファイルの命名規則は適切なものであり、何も配置する必要はありません。非常にシンプルなツールとスクリプトで強化できます。データベースは必要ありません。いくつかのスクリプトと命名規則だけの専用インフラストラクチャは必要ありません。
あなたが必要とするものがまったくない場合、あなたのニーズは簡単です。これから始めましょう。
あなたの要件はこの慣習を超えていますか?適切なメタデータファイルで拡張します。後でこれをよりよく検索する必要がありますか?必要な場所に移動するファイルを検索するための優れたソリューションがすでにあります。
私はデータベースが嫌いというわけではありません。それどころか、本当に強力で便利ですが、データベースを使用するにはある程度のオーバーヘッドが必要です。それらをインストール、バックアップ、保守する必要があります。完全に専任ではないにしても、このインフラストラクチャに時間の一部を費やす必要があるスタッフが必要になります。彼らはまた、素人にとってより複雑で不可解であり、あなたをセットアップした開発者を失い、あなたが交換を見つけるまであなたのシステムは時間内に行き詰まります。
適切な監視でローテクの力を過小評価しないでください。
そして、ローテクソリューションが大きくなる頃には、ニーズに最適なシステムを実装するためのすべての経験と要件を収集しているでしょう。
最初に、ファイルが何であるかに同意しましょう。ファイルは、(非常に近い)アトミック操作で送信、受信、作成、削除できる名前を持つパッケージ化されたデータです。
多くのファイルシステム(Mac OS、および最近のLinuxファイルシステム)は、多くの場合リソースとメタデータを格納するために使用される「フォーク」を実装しています。メタデータを保存するこのアプローチは、特にソースと宛先のファイルシステムがファイルフォークを異なる方法で理解している場合、従来のネットワーク転送方法、バックアップおよび復元方法、ファイルコピー方法が一貫していないという問題がありました。
ファイル名はメタデータを保持するために使用されます。a)常に存在する、b)メタデータが常にファイル名に存在する(少なくともファイル拡張子を使用する)、c)ファイル名が移動時にほとんど翻訳されないシステム間(大文字と小文字の区別、文字セットの制限、文字の制限は別)。
そのため、ファイル名は表示、移植、管理が容易です。これは、一部のメタデータを保存するのに悪いことではありません。
おそらく、一般的なファイルメタデータに対処する最適なソリューションは、コンテンツリポジトリを使用することです。この場合、コンテンツリポジトリは、ファイルに使用されるメタデータスキーマで構成できます。多くの場合、これはやり過ぎですが、私見は、真剣なメタデータ管理を行う方法です。
これについての私の見解は、ファイル名でだらしないか壊れやすいコードをどこかで見たことがあるかもしれませんが、それは「ファイル名にメタデータを保存する」が一般的に悪いことを意味しません。
ファイル名はメタデータです。ファイルデータ自体とは関係なく、ファイル内のデータに関するデータです。実際、ファイル名は非常に古いため、おそらくメタデータの標準的な例です。
ファイル拡張子がファイル名の最後の部分に過ぎないと考える場合、メタデータとしてのファイル名の概念はさらに避けられないものになります。