假设您在一个公共类别中有多个布尔字段,哪种数据库存储方法在速度和处理方面(对于 MySQL 和 PHP)更有效?
例如,如果选择汽车,您可能有一个类别“选项”,其中包含以下选项:(GPS、拖车包、雷达、动力转向)。所有选项都是布尔字段,必须回答,并且必须是TRUE
or 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;
或者选择一个名为“options”的字段,带有位样式的数据存储,例如:
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
并提取:
$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 结构,并且在所有选项都是布尔值的情况下,可能每次都需要。
这是一个理论示例,但我对每种方法的优缺点感兴趣。