web-dev-qa-db-ja.com

プラットフォーム構成をデータベースまたはファイルに保存する方が良いですか?

現在、データベーステーブルを使用して、最大ファイルサイズ、最大ユーザー数、サポートメールなどのプラットフォーム設定を保存するアプリを開発しています。

つまり、プラットフォーム設定を追加するたびに、このテーブルに列を追加する必要があります。

以前のプロジェクトでは、そのような情報をファイルに保存するために使用されていました。

より良い/より速いアプローチは何ですか?

ps、私は誰かがすでにそのような質問をしたとほぼ確信していますが、私はそれを見つけることができないようです

25
Pavel K.

それは本当にあなたのアプリケーションに依存します。

データベースに設定を保存することには、いくつかの利点があります。

  1. セキュリティ-ユーザーはファイルの設定を簡単に変更したり、内容を上書きしたりできます。
  2. 配布の場合-同じ設定を更新して、ネットワーク上の任意のマシンにロードできます。

短所:

  1. データベース接続に依存
  2. データベースから読み取るときのオーバーヘッド

ファイルへの保存の利点:

  1. すばやく簡単に読み、変更できます。

短所:

  1. 上記のセキュリティの問題。
  2. 機密データの暗号化が必要になる場合があります。
  3. バージョンごとに別々のファイルを作成する必要があるため、バージョン管理は困難です。

つまり、プラットフォーム設定を追加するたびに、このテーブルに列を追加する必要があります-使用しているデータベースによって異なりますが、設定全体をXML(SQLサーバーで許可されています)としてテーブルに保存できるため、設定を追加するたびにテーブルスキーマを変更する必要はありません。 XMLを変更するか、XMLに要素を追加するか、XMLから削除するだけです。

しかし、結局のところ、あなたは自分で決める必要があります。誰にとっても良いことも悪いこともありません。

10
K2so

構成設定は、次のようなキー/値タイプのテーブルに保存されます。

CREATE TABLE Configuration.GlobalSettings
(
    SectionName VARCHAR(50),
    SettingName VARCHAR(50),
    SettingValue VARCHAR(1000),
    SettingType TINYINT
);

SectionNameSettingNameが主キーです。これらを分割するだけで、セクションの内容を簡単に照会できるようになり、個々のセクションをハンドラーにロードするのではなく、ハンドラーにロードできるようになります。一度にたくさん。 SettingValueは文字列であり、SettingTypeは、設定値の解釈方法を示す識別子です(たとえば、1 =文字列、2 =ブール、3 = 10進数など)。 。

つまり、新しい設定のためにテーブル構造を変更する必要はありません。デプロイメントスクリプトまたはこれらを設定する場所に新しいものを追加するだけです。

ファイルよりも構成を行う方が良い方法であることがわかりました。これは、必要に応じて管理インターフェースを介して構成値をプログラムで簡単に変更できることを意味します。これにより、各設定に入力できる内容に関するロジックを適用できます。ファイルではこれを簡単に行うことはできません(もちろん可能ですが)。

41
Greg Beech

多くのサイトで特に大規模なアプリケーションを管理しているので、構成をローカルファイルに保持するのは完全に苦痛だと言えます。多くの場合、構成は読み取られてキャッシュされ、実行時に変更できません。他のシステムには、構成を繰り返し変更してバウンスする必要があるスケールアウトシステムがあります。

設計者がシステムプロパティをDBに保持するだけであれば、システムランドスケープの実装中の私の生活は10%楽になります。

15
Jé Queue

なぜ毎回新しい列があるのですか? NAMEとVALUEの2つの列だけではないのはなぜですか。

ファイルにデフォルトを設定し、展開ごとに必要に応じてデータベースでそれらのデフォルトをオーバーライドします。

また、速度の観点から、構成をキャッシュします(リロードをトリガーする機能を備えています)。プロパティが必要になるたびに構成を再読み込みしても意味がありません。したがって、速度に関しては、それは実際には重要ではありません。あなたは一度それをします。

10
z5h

公平を期すために、答えはそれほど明確ではありません。

上記の回答は、さまざまな環境、つまりdev、qa、staging、prodにデプロイする必要があるアプリケーションを考慮していないようです。

また、バージョン管理の構成の重要性、つまり、誰が何を、どこで、いつ変更したかを知ることも考慮していません。

最新のフレームワークはすべて、通常は環境変数を介して、特定の環境の適切な構成をフェッチする方法を提供します。

各環境には独自の設定があります。symfonyが設定ファイルをレイアウトする方法を検討してください。

your-project/
├─ app/
│  ├─ ...
│  └─ config/
│     ├─ config.yml
│     ├─ config_dev.yml
│     ├─ config_prod.yml
│     ├─ config_test.yml
│     ├─ parameters.yml
│     ├─ parameters.yml.dist
│     ├─ routing.yml
│     ├─ routing_dev.yml
│     └─ security.yml
├─ ...

これらの理由から、私は間違いなくファイルでの構成を好みます。

私の2セント。

5
stefgosselin

皆さんが言ったように、アプリケーション環境と要件によって異なります。しかし、私が一般的なルールを選ばなければならないとしたら、私は両方とも言うでしょう。まず、すべての構成を格納するデータベーステーブルを作成します。これには2つの理由があります。1)バージョン管理-以前の構成を簡単に追跡できます。 2)管理-ユーザーが設定を変更するためにアクセスできるインターフェースを作成できます。

次に、サイトを保存して本番環境に公開した後、それらすべての設定を簡単にアクセスできるファイルに保存するファイルを作成します。実際、Web用にPHPでプログラミングしている場合、そのファイルは、それ以上の操作を必要としない配列データ(キーと値のペア)を含むphpファイルである必要があります。つまり、 yaml、またはjsonを配列に変換する必要があります(それが必要な最終出力である場合)。

1
Hilkiah Makemo