2

現在、Webアプリケーションのカスタムフィールドを実装するさまざまな方法を検討しています。ユーザーは、特定のエンティティのカスタムフィールドを定義し、このデータを入力/表示できる必要があります(場合によっては後でデータをクエリできます)。

カスタムフィールドを実装するにはさまざまな方法があることを理解しています(たとえば、名前/値テーブルの使用や変更テーブルの使用など)。現在、ALTERTABLEを使用して新しいユーザーフィールドをデータベースに動的に追加することを推奨しています。

他の関連するSOトピックを閲覧した後、このソリューションの大きな欠点は見つかりませんでした。対照的に、高速な方法で(たとえば、SQLのwhereステートメントを直接使用して)データをクエリするオプションがあることは、私たちにとって大きな利点です。

この方法でカスタムフィールドを実装することで考えられる欠点はありますか?最大100人のユーザーが同時に使用し(同時要求ではない)、MySQLデータベースとMSSQLServerデータベースの両方を使用できるWebアプリケーションについて説明しています。

4

3 に答える 3

2

更新と同様に、ALTER TABLEを介して既存のデータベーステーブルに新しい列を追加して、カスタムフィールドを実装することにしました。いくつかの調査とテストの結果、これはほとんどのデータベースエンジンに最適なソリューションのように見えます。カスタムフィールドに関するメタ情報を含む別のテーブルは、カスタムフィールドの管理、クエリ、および操作に必要な情報を提供します。

于 2010-09-06T11:47:28.647 に答える
2

私が目にする最初の欠点は、アプリケーションサービスにALTER権限を付与する必要があることです。
これは、アプリケーションがフィールドを追加するだけでなく、フィールドを削除して名前を変更し、いくつかのテーブルを作成できるため、セキュリティモデルに注意を払う必要があることを意味します(少なくともMySQLの場合)。

次に、ユーザーごとに必要なフィールドをどのように区別しますか?または、ユーザーAによって作成されたフィールドにユーザーBがアクセスできますか?

列のカーディナリティも大幅に増加する可能性があることに注意してください。すべてのユーザーが2つのフィールドを追加すると、すでに200のフィールドについて話していることになります。

個人的には、2つのアプローチのいずれかまたはそれらを組み合わせて使用​​します。

  1. シリアル化されたフィールドの使用

シリアル化された辞書を格納するテーブルに1つのテキストフィールドを追加します。

{ 
  user_1: {key1: val1, key2, val2,...}, 
  user_2: {key1: val1, key2, val2,...}, 
  ...
}

欠点は、値を簡単に検索できないことです。

  1. マルチタイプの名前/値テーブルを使用する

フィールドテーブル:

user_id:int
field_name:varchar(100)
type:enum('INT'、'REAL'、'STRING')

値の表:

field_id:int
row_id:int#メインテーブルの行ID
int_value:int
float_value:float
text_value:text

もちろん、結合が必要であり、実装は少し複雑ですが、はるかに一般的であり、適切にインデックス付けされている場合は非常に効率的です。

于 2010-02-05T13:51:05.843 に答える
1

データベーステーブルに新しいカスタムフィールドを追加しても問題はありません。

このアプローチでは、特定の/最も適切なタイプを使用できます。つまり、intフィールドが必要ですか?それをintとして定義します。名前/値型テーブルでは、複数のデータ型を1つの型として格納することになります(おそらくnvarchar)-異なる型の複数の列でその名前/値テーブルを完成させ、適切なものに入力しない限り、それは少し恐ろしいです。

また、新しい列を追加すると、クエリが簡単になり、新しい名前/値テーブルへの結合を行う必要がなくなります。

一般的な感じではないかもしれませんが、「フリーサイズ」の名前/値テーブルを用意するよりはましだと思います。

SQL Serverの観点から(2005以降)...
別の方法として、XMLタイプの「カスタムデータ」フィールドを1つ保存することもできます。これは本当に一般的であり、フィールドを作成したり、別の名前を付けたりする必要はありません。 /valueテーブル。また、すべてのレコードが同じカスタムデータを持っている必要はないという利点もあります(つまり、1つのフィールドが共通ですが、含まれているものが同じである必要はありません)。パフォーマンスへの影響は100%ではありませんが、XMLデータにインデックスを付けることができます。

于 2010-02-05T13:16:54.820 に答える