0

チェックボックス付きのフォームを作成しました:

<input type="checkbox" name="cars[]" value="Toyota" /> Toyota
<input type="checkbox" name="cars[]" value="Honda" /> Honda
<input type="checkbox" name="cars[]" value="Nissan" /> Nissan

PHP の部分では、配列を読み取り、次のように挿入します。

$carvalue = "";
foreach($_POST['cars'] as $single){
    $carvalue .= $single;
    $carvalue .= ", ";
}

$carvalue変数で区切られた値 (Toyota、Honda、Nissan など)を mysql db テーブルに挿入します。これは正しいです?

4

5 に答える 5

0

次の正規形の場合、最初の正規形に違反するため、それは悪い考えです (Bcoz の単一フィールドに複数の値を含めることが許可されています)。

通常形のリファレンス: http://en.wikipedia.org/wiki/First_normal_form

于 2013-10-13T12:01:13.477 に答える
0

何が正しいかは、データの用途によって異なりますが、これらの値を文字列に連結する際に注意すべき点がいくつかあります。たとえば、これまでに "Honda" を含むすべての行を検索したい場合 (おそらくそうするでしょう)、これはデータを保存する方法としては不適切な場合があります。

car_make、car_make_group、car_make_to_group などの追加のテーブルを作成することになるでしょう。私は置くだろう

car_make (make_id, make_desc)
------------------
1, "Toyota"
2, "Honda"
3, "Nissan"

私はビットフラグ列挙型のようにグループに番号を付けますが、それはそれほど重要ではありません..衝突しないようにグループに番号を割り当てる方法にすぎません。また、すべてが加算される (group2 + group4 = group6) という性質もあります。ただし、私は常に関連テーブルを提供しています。

car_make_group (make_group_id, make_group_desc)
------------------
1, "Toyota"
2, "Honda"
3, "Toyota, Honda"
4, "Nissan"
5, "Toyota, Nissan"
6, "Honda, Nissan"
7, "Toyota, Honda, Nissan"

最後に、クエリに役立つ関連テーブルを作成します。

car_makes_to_group (make_id, make_group_id)
------------------
1, 1
1, 3
1, 5
1, 7
2, 2
2, 3
2, 6
2, 7
3, 4
3, 5
3, 6
3, 7    

複数のテーブルを使用すると、将来の変更に柔軟に対応できます。たとえば、JSON を使用する必要があることに後から気付くことができ、make_group_desc を変更してコンマ区切りの文字列ではなく JSON 文字列を保持することができます。

「Toyota」を含むすべての行を検索するアドホック クエリを実行することもできます。

Select m.make_id, m.make_desc, g.make_group_id, g.make_group_desc
FROM car_make_to_group t
INNER JOIN car_make_group g
ON (t.make_group_id = g.make_group_id)
INNER JOIN car_make m
ON (t.make_id = m.make_id)
WHERE m.make_desc = "Toyota" 
于 2013-10-13T12:48:21.830 に答える