私は、自分自身の開発のために社内で使用する基本的な CMS を実装することを計画しています。自分のニーズに合わせてカスタム CMS を開発したいと考えています。これは、Dreamweaver よりも軽く、移植性が高く、冗長性が少ないものですが、コーディング方法を既に知っていて、情報を統合する必要がある人を対象としています。基本的には、MySQL データベースにすべてを保存し、ファイル システムにすべてをキャッシュし、フェッチしている PHP ファイルを介してデータがクエリされるたびに、単純なクエリがデータベースに送信され、そのリソースが最後に更新された時期をチェックするという計画です。 、システム上のキャッシュされたファイルが十分に新しい場合は、キャッシュ ディレクトリからプルされます。それ以外の場合、キャッシュ ファイルは上書きされます。
CMS はすべてのアップロードをデータベースに保存するため、システムを別のホストに移動する必要がある場合などにすべてが 1 か所に保管されます。また、バックアップが非常に簡単になり、diff/revision リポジトリなどを実装するように簡単に拡張できます。 .
アップロードされたすべてのファイルと、CMS インターフェイスを介して作成されたリソース (ページ、テンプレートなど) を含む単一のテーブル (「アセット」など) を作成したいと考えています。理想的には、ASCII (テキスト) とバイナリ (BLOB) の 2 つのタイプを処理します。
テーブル「資産」
id INT、slug VARCHAR、ascii LONGTEXT、バイナリ LONGBLOB、type INT、meta TEXT、変更された DATE、...
私の質問は、この情報を 1 つの表にまとめることは理にかなっていますか? 「資産」テーブルの特定の行は、ASCII 列またはバイナリ列のいずれかにのみ値を持ち、両方には決して値を持ちません。これはスペースを無駄にしますか?プロセスをまったく遅くしますか?
列が不必要に選択されることはありません。「type」フィールドは「types」テーブルの ID に対応し、テキスト タイプ (html、テンプレート、プレーンテキストなど) とバイナリ タイプ (png、jpg、pdf、mp3、mp4 など) がリストされます。したがって、次のようにクエリできます。
(明らかに疑似コード)
$lastModified = SELECT modified FROM assets WHERE slug = $asset_slug;
if last_modified_date_of_file("cache/$asset_slug") != $lastModified :
$type_id = SELECT type FROM assets WHERE id = $asset_id;
$type_col = SELECT col FROM types WHERE id = $type_id;
if $col == 'ascii'
cache_file("cache/$asset_slug", SELECT ascii FROM assets WHERE slug = $asset_slug);
else
cache_file("cache/$asset_slug", SELECT binary FROM assets WHERE slug = $asset_slug);