我最近一直在尝试 RDB 设计,我想知道将项目存储在一个可以有多个值的字段中:
CARS Color_avail
1 corvette 1, 2, 3 <<<<<<<
2 ferrari 2
3 civic 1
COLORS
1 red
2 White
3 black
所以在 CRUD 上,我想通过下拉/复选框或可以保存多个值的东西添加多个项目。
我最近一直在尝试 RDB 设计,我想知道将项目存储在一个可以有多个值的字段中:
CARS Color_avail
1 corvette 1, 2, 3 <<<<<<<
2 ferrari 2
3 civic 1
COLORS
1 red
2 White
3 black
所以在 CRUD 上,我想通过下拉/复选框或可以保存多个值的东西添加多个项目。
在逗号分隔的列表中存储关系在某些意义上是有意义的。不过,您不需要逗号。有 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();
要隐藏实际字段,您可以使用“hidden”而不是“line”或使用 JavaScript 来隐藏它:
$field->js(true)->hide();
或者
$field->js(true)->closest('dl')->hide();
如果您还需要在字段周围隐藏标记。
我可以看到在表单中显示这样的输出的好处,但是你真的想这样将它存储在数据库中吗?
例如,使用包含逗号分隔列表的数据模型(如您的示例中所示),您将使用什么 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 或 like 这会阻止索引和均值的使用随着数据量的增长,性能会迅速下降。