1

私は最近 RDB 設計を試していて、複数の値を持つことができるフィールドに項目を格納することについて疑問に思っていました:

    CARS        Color_avail
  1  corvette    1, 2, 3        <<<<<<<
  2  ferrari      2
  3  civic        1


    COLORS 
  1  red
  2  White 
  3  black 

CRUDでは、ドロップダウン/チェックボックスまたは複数の値を保持するものを介して複数のアイテムを追加したいと思います。

4

2 に答える 2

2

リレーションをコンマ区切りのリストに格納することは、ある意味で理にかなっています。ただし、コンマは必要ありません。これに役立つ既存のコントロールが 2 つあります。

フォームにチェックボックスを含む値のリストを表示する:

$form->addField('CheckboxList','corvette')->setValueList($array);

($model->getRows() を介して配列を設定できますが、連想させる必要があると思います。おそらく var_dump と foreach でそれらを結合できます)。

他のオプションは、選択可能なグリッドで隠しフィールドを使用することです。

$field = $form->addField('line','selection');
$grid = $form->add('MVCGrid');
$grid->setModel('Colors',array('name'));
$grid->addSelectable($field);

$form->addSubmit();

実際のフィールドを非表示にするには、「line」の代わりに「hidden」を使用するか、JavaScript を使用して非表示にします。

$field->js(true)->hide();

また

$field->js(true)->closest('dl')->hide();

フィールドの周りのマークアップも非表示にする必要がある場合。

于 2011-09-13T19:25:42.503 に答える
2

このような出力をフォームに表示する利点はわかりますが、本当にこのようにデータベースに保存しますか?

たとえば、あなたの例のようにカンマ区切りのリストを保持するデータモデルでは、白で利用可能なすべての車を識別するためにどの SQL を使用しますか?

このような多対多の関係を保持する従来の方法は、追加のテーブルを使用することです。たとえば、次の内容の CAR_COLOUR を保持する別のテーブルがあります。

 CAR      COLOUR
 1        1
 1        2
 1        3
 2        2
 3        1

これで、すべての車と色のリストを取得するなどのクエリを簡単に実行できるようになりました

SELECT CAR, COLOUR
  FROM CARS CA, 
       COLOUR COL, 
       CAR_COLOUR CACOL
 WHERE CA.CAR=CACOL.CAR
   AND CACOL.COL=COL.COLOUR

または、白い車だけが必要な場合は、WHERE 句に次を追加します

   AND COL.COLOUR='White'

id フィールドと CAR_COLOUR の両方のフィールドのインデックスは、何千行もある場合でも優れたパフォーマンスが得られることを意味しますが、それらすべてを単一のフィールドのコンマ区切りリストに入れると、 substr などを使用する必要があり、インデックスと平均を使用すると、データ量が増加するにつれて、パフォーマンスが急速に低下します。

于 2011-09-24T03:54:41.307 に答える