Структура данных MySQL по сравнению с рассчитанными данными для данных типа Checkbox

Предполагая, что у вас есть несколько логических полей в общей категории, какой метод хранения базы данных более эффективен как для скорости, так и для обработки (как для MySQL, так и для PHP)?

Например, при выборе автомобиля у вас может быть категория «варианты» со следующими параметрами: (GPS, пакет буксировки, радар, Powersteering). Все параметры являются логическими полями, на которые необходимо ответить, и они должны быть TRUE или FALSE .

Лучше ли настроить таблицу с каждым полем:

 CREATE TABLE IF NOT EXISTS `manycars` ( `vin` int(10) unsigned NOT NULL AUTO_INCREMENT, `hasGps` tinyint(1) NOT NULL COMMENT '1= TRUE, 0=FALSE', `hasTow` tinyint(1) NOT NULL COMMENT '1= TRUE, 0=FALSE', `hasRadar` tinyint(1) NOT NULL COMMENT '1= TRUE, 0=FALSE', `hasPsteer` tinyint(1) NOT NULL COMMENT '1= TRUE, 0=FALSE', PRIMARY KEY (`vin`), ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

или выберите одно поле с именем «параметры» с хранилищем данных в стиле бит, например:

 CREATE TABLE IF NOT EXISTS `singlecars` ( `vin` int(10) unsigned NOT NULL AUTO_INCREMENT, `options` int(3) unsigned NOT NULL COMMENT '1= GPS, 2=Tow, 4=radar, 8=psteer', PRIMARY KEY (`vin`), ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Чтобы определить значения для каждого булева, я бы затем SELECT options, vin FROM singlecars такие SELECT options, vin FROM singlecars как SELECT options, vin FROM singlecars и extract:

 $q=SELECT options, vin FROM singlecars $r=mysqli_query($dbconnect, $q); while($record = mysqli_fetch_array($r, MYSQLI_ASSOC)){ $option=decbin($record['options']; // returns binary $gps=substr($option,3,1); $tow=substr($option,2,1); $radar=substr($option,1,1); $psteer=substr($option,0,1); echo "GPS=$gps, Tow package=$tow, Radar=$radar, Power Steering=$psteer <br />"; } 

Мои мысли таковы, что первая таблица «manycars» имеет лучшую семантику и быстро запрашивает и минимальный PHP-код для написания запроса. Однако во второй таблице «singlecars» используется меньше структуры SQL, и в случае, когда все опции являются логическими, они, вероятно, понадобятся каждый раз.

Это теоретический пример, но меня интересует pro / con каждого метода.

Я бы выбрал вариант с отдельными полями для каждой опции.

  • Это быстрее: вам не нужно использовать substr в цикле while (это место, где вы можете замедлить работу с большим объемом данных).
  • Он гибкий: например, вам нужно выбрать все автомобили с помощью радара . SELECT ... WHERE hasRadar = 1 . Вот и все.