Хранение ссылок на таблицы в текстовом поле (для Agile Toolkit) - PullRequest
1 голос
/ 13 сентября 2011

В последнее время я экспериментировал с дизайном RDB, и мне было интересно хранить элементы в поле, которое может иметь более одного значения:

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


    COLORS 
  1  red
  2  White 
  3  black 

так что в CRUD я хотел бы добавить более одного элемента через выпадающий список / флажки или что-то, что будет содержать несколько значений.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Я вижу преимущество отображения такого вывода в форме, но вы действительно хотите сохранить его в базе данных?

Например, для модели данных, содержащей список, разделенный запятыми, как в вашем примере, какой 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 или подобное что препятствует использованию индексов и означает, что по мере роста объема данных производительность будет быстро падать.

2 голосов
/ 13 сентября 2011

Хранение отношений в списке, разделенном запятой, имеет смысл в некоторых смыслах. Вам не нужны запятые, хотя. Есть 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();

Чтобы скрыть фактическое поле, вы можете использовать «скрытый» вместо «строка» или использовать JavaScript для его скрытия:

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

или

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

если вам нужно скрыть разметку и вокруг поля.

...