5

ユーザーが新しいフィールドをレコードに追加できるようにする必要があります。たとえば、連絡先レコードがある場合、ユーザーは「SSN」数値フィールドと「生年月日」日付/カレンダー フィールドを追加することができます。もちろん、彼らはこれをUIを介して行います。

これらのフィールドは、すべての連絡先レコードの入力に使用できる必要があります。

私のアプリケーションは多くのユーザーに対して同時に実行され (単一の会社の展開などではありません)、理論的には誰もが独自のカスタム フィールドを追加できることを考慮すると、特に検索可能にする必要がある場合に、この情報をデータベースに保存するベスト プラクティスは何でしょうか。 ?

4

3 に答える 3

11

フィールド名と型を格納するテーブルを用意します。

field_ID     INT
field_name   VARCHAR
field_type   ENUM('int','float','text','richtext')

レコード テーブルのエントリへのリンク、フィールド テーブルのエントリへのリンク、およびフィールド値を格納するテーブルを用意します。

fieldvalue_fieldID   INT
fieldvalue_recordID  INT
fieldvalue_value     BLOB

検索可能にすることは別の課題です。その fieldvalue_value から検索可能なコンテンツを取得し、それにインデックスを付ける必要があります。これはデータベース固有のものです。MySQL では、それを TEXT 値にして、それに MySQL FULLTEXT インデックスを追加できます。

于 2009-06-07T05:10:48.533 に答える
1

ほぼすべてのアプリケーション/製品に追加の属性/フィールドサポートを追加して、ユーザーに柔軟性を与えます
製品カテゴリがあるように、カテゴリでは、顧客は任意の製品の追加属性を定義できます
DBレベルで行っていることは次のとおりです:
カテゴリテーブルText1Att、Text2Att...テキスト値のサポート、Num1Att、Num2Att...数値のサポート、Date1Att、Date2Att...日時値のサポート、ID1Att、ID2Att...他のIDのサポートなどの追加の列がありますドロップダウン、リストボックスなどを追加できるようなテーブル...
ここでは、すべての列に文字列データ型があります。
ここに保存するのは

、Text1Att メタが
SSN;textbox;50;true;false;Null; のように、ここにメタ情報を保存することです。
フィールドのキャプション;コントロール タイプ;最大長;必須フィールド;カスタム検証が必要; カスタム検証メッセージ。
出生地;テキストボックス;100;true;true;無効な値;
数値フィールドと同じ ...
日付のメタ情報は生年月日のように見える
;カレンダー コントロール;true;true;無効な日付;
フィールドのキャプション; カレンダー コントロールまたはその他の可能性があります。必須です。カスタム検証です。カスタム検証メッセージ。


製品テーブルで行っているのは、同じ数の列を追加し、データ型 text1Att、.. は varchar、num1Att は数値、date1Att は datetime、ID1Att は int です。

GUI 側で行っていることは次のとおりです。カテゴリ定義ページでこれらの属性を追加し、実行時にメタ情報を作成してカテゴリ テーブルに格納します
。一方、カテゴリで製品を定義すると、メタ情報が読み取られ、カテゴリ テーブルからトラバースされて入力されます。他のフィールドと同様に製品定義ページ。


さらにサポートが必要な場合は、画像を提供して、これを行う方法をよりよく理解できるようにします。
私たちは経験と分析を行っています。これは非常に柔軟なアプローチです

于 2009-06-07T06:15:28.553 に答える
1

あなたの最良の選択肢は次のとおりです。

  1. モジュールをアップロードするか、スクリプトを実行するなどして、ユーザーが独自のデータベース スキーマを変更できるようにします。

  2. XML フィールドと、そのフィールドの内容に対するインデックスとクエリをサポートするデータベースを使用する

これらは Martin Fowler によって推奨されています: http://martinfowler.com/bliki/UserDefinedField.html

于 2013-01-20T03:48:25.100 に答える