在文本字段中存储表引用(用于Agile Toolkit)


Storing table references in text field (for Agile Toolkit)

我最近一直在尝试RDB设计,我想知道在一个可以有多个值的字段中存储项:

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

    COLORS 
  1  red
  2  White 
  3  black 

所以在CRUD上,我想通过下拉/复选框或其他可以保存多个值的东西添加多个项目。

我可以看到在表单中这样显示输出的好处,但是您真的想在数据库中这样存储它吗?

例如,如果数据模型中包含逗号分隔的列表,那么您将使用什么SQL来识别所有可用的白色汽车?保存这种多对多关系的传统方法是使用一个额外的表,例如,你有一个单独的表,包含car_color和以下内容
 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_color字段上的索引将意味着您获得出色的性能,即使您有数千行,而将它们全部放在单个字段中的逗号分隔列表中将意味着您必须使用substr或类似的方法,这将防止使用索引,并且随着数据量的增长,性能将迅速下降。

将关系存储在逗号分隔的列表中在某种意义上是有意义的。你不需要逗号。有两个现有的控制可以帮助你做到这一点。

显示表单:

中带有复选框的值列表
$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();

要隐藏实际的字段,你可以使用"hidden"代替"line",或者使用JavaScript来隐藏它:

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

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

如果你也需要隐藏字段周围的标记。