【问题标题】:MySQL data structure vs. calculated data for Checkbox type dataMySQL 数据结构与 Checkbox 类型数据的计算数据
【发布时间】:2012-08-17 17:29:41
【问题描述】:

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

例如,如果选择汽车,您可能有一个类别“选项”,其中包含以下选项: (GPS,拖车包,雷达,动力转向)。所有选项都是布尔字段,必须回答,并且必须是TRUEFALSE

是不是每个字段都建个表比较好:

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 结构,并且在所有选项都是布尔值的情况下,可能每次都需要。

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

【问题讨论】:

    标签: php mysql data-structures boolean boolean-operations


    【解决方案1】:

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

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

    【讨论】:

    • 我没有考虑你的第二个要点;这很有意义!好答案!
    猜你喜欢
    • 2021-05-08
    • 2010-11-12
    • 1970-01-01
    • 2011-05-13
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多