0

假设您在一个公共类别中有多个布尔字段,哪种数据库存储方法在速度和处理方面(对于 MySQL 和 PHP)更有效?

例如,如果选择汽车,您可能有一个类别“选项”,其中包含以下选项:(GPS、拖车包、雷达、动力转向)。所有选项都是布尔字段,必须回答,并且必须是TRUEor 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 结构,并且在所有选项都是布尔值的情况下,可能每次都需要。

这是一个理论示例,但我对每种方法的优缺点感兴趣。

4

1 回答 1

1

我会为每个选项选择带有单独字段的变体。

  • 它更快:你不需要substr在你的 while 循环中使用(这是一个你可以在处理大量数据时放慢速度的地方)。
  • 它很灵活:例如,您需要选择所有带有 雷达的汽车。SELECT ... WHERE hasRadar = 1. 就是这样。
于 2012-08-17T18:08:07.247 回答