Предполагая, что у вас есть несколько логических полей в общей категории, какой метод хранения базы данных более эффективен как для скорости, так и для обработки (как для 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
. Вот и все.