0

私は、自分自身の開発のために社内で使用する基本的な 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);
4

1 に答える 1

1

一般に、データベースにバイナリ データを格納している場合は、何か問題があります。移行を簡単にしたいという要望には感謝していますが、データベースに mp3 を保存すると、データベースの速度が低下することがすぐにわかります。データベースは少量のデータをすばやく取得できるように最適化されており、ファイルシステムは大量のデータに組織的にアクセスできるように最適化されています。同様のシステムを実装したとき、ファイルの場所をデータベースに保存し、ファイル自体をファイルシステムに保存しました。移植性のために、ファイル名を「assets」テーブルに保存し、アセット ストアへのパスをデータベースの別の場所に保存することもできます。

通常、適切なデータベース設計とは、エンティティに関連付けられたデータからエンティティのプロパティを分離することを意味します。 「電話番号」などのデータは、個人の属性ではなく、個人に関連付けられたデータであるため、別の場所に保存する必要があります。あなたの場合、資産データを資産にリンクするために、別のテーブルを「資産」テーブルにFKする方が良いでしょう(IMO)。

于 2013-04-20T23:25:47.083 に答える