0

共通のカテゴリ内に複数のブール フィールドがあると仮定すると、速度と処理の両方で (MySQL と PHP の両方で) 効率的なデータベース ストレージ メソッドはどれですか?

たとえば、車を選択する場合、「オプション」カテゴリがあり、次の選択肢があります: (GPS、牽引パッケージ、レーダー、パワーステアリング)。すべてのオプションはブール値フィールドであり、回答する必要があり、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て抽出します。

$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 コードを使用できます。ただし、2 番目のテーブル「singlecars」では、使用する SQL 構造が少なく、すべてのオプションがブール値である場合は、毎回必要になる可能性があります。

これは理論上の例ですが、それぞれの方法の賛否両論に興味があります。

4

1 に答える 1

1

オプションごとに個別のフィールドを持つバリアントを選択します。

  • より高速です。whileループで使用する必要はありませんsubstr(これは、大量のデータを処理しているときに速度が低下する可能性がある場所です)。
  • 柔軟性があります。たとえば、 レーダー付きのすべての車を選択する必要があります。SELECT ... WHERE hasRadar = 1。それでおしまい。
于 2012-08-17T18:08:07.247 に答える