共通のカテゴリ内に複数のブール フィールドがあると仮定すると、速度と処理の両方で (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 構造が少なく、すべてのオプションがブール値である場合は、毎回必要になる可能性があります。
これは理論上の例ですが、それぞれの方法の賛否両論に興味があります。