1

次のようなテーブルがあります。

+--------+---------------+--------------+---------------+
|   id   |   firstname   |   lastname   |   foods       |
+--------+---------------+--------------+---------------+
|   1    |   James       |   Bonds      |   BBQ         |
|   2    |   James       |   Bonds      |   Hamburger   |
|   3    |   James       |   Bonds      |   Pizza       |
|   4    |   David       |   Smith      |   BBQ         |
|   5    |   David       |   Smith      |   Pizza       |
+--------+---------------+--------------+---------------+

これは、データベースに挿入するときの私のコードです:

if($_POST["Submit"]=="Submit"){
for ($i=0; $i<sizeof($checkbox);$i++){
$sql="INSERT INTO tbl_info VALUES ('NULL', '$fname','$lname', '".$checkbox[$i]."')";
$result=mysql_query($sql);
 }
}

または、次のようにすることは可能ですか?

+--------+---------------+--------------+---------------+
|   id   |   firstname   |   lastname   |   foods       |
+--------+---------------+--------------+---------------+
|   1    |   James       |   Bonds      |   BBQ         |
|   1    |   James       |   Bonds      |   Hamburger   |
|   1    |   James       |   Bonds      |   Pizza       |
|   2    |   David       |   Smith      |   BBQ         |
|   2    |   David       |   Smith      |   Pizza       |
+--------+---------------+--------------+---------------+

'foods' 列はチェック ボックスの値であるため、冗長になりました (ユーザーが 10 個のチェック ボックスの値を選択した場合、同じ名を持つ 10 行も生成されます)。

The problem is if I need to alter the information of the user, I have to alter it 1 by 1 and that's so wrong. And if I am going to delete the users information, the training column values should also be deleted all at once.(I must not use implode or explode). I'm sorry. new to php.

Thanks in advance.

4

4 に答える 4

2

次の 3 つのテーブルが必要です。

Person Table (person_id, firstname, lastname)

Food Table (food_id, name)

PersonFood Table (person_id, food_id)

レコードを挿入するときは、個人の詳細を個人テーブルに入力します。食品の詳細を食品テーブルに保存します。人が食べ物を気に入ったら、person_id と food_id を含むレコードを PersonFood テーブルに追加します。このように、個人の詳細が変更された場合、個人テーブルのレコードを変更するだけで済みます。結果を取得するときは、結合クエリを使用できます。

このタイプの正規化形式は、第 3正規形と呼ばれます。

于 2012-12-24T03:02:34.677 に答える
0

これはN:Nの関係です。

N人が存在します

N種類の食品が存在します

誰でもどんな食べ物でも欲しがります。

あなたが書いたテーブルの問題はこれです:

  1. JamesBondsを削除するとします。ハンバーガーがテーブルから削除されました。しかし、ハンバーガーはまだ存在していますが、あなたのテーブルには存在しないように見えます(理解しましたか?)

  2. ピザとハンバーガーが好きな人を選んだとしましょう。ジェームズ・ボンドの名前は2回表示されますが、彼は1人なので間違っています

....私はあなたが上で説明した概念で方法を指摘し続けることができました。

それを正規化する方法

3つのテーブルが必要です

Person (person_id, firstname, lastname)

Food (food_id, name)

PersonFood_Join (person_id, food_id)

ここで(そして外部キーを知っているといいのですが)

PersonFood_Join(person_id)は、Person(person_id)への外部キーです。

Food_Join(food_id)は、Food(food_id)の外部キーです。

食品データは静的であるため(チェックボックスの束)、簡単に挿入して永続的に保持できます。

1人あたり1行を追加すると、上記のすべての異常が削除されます(現在、人の名前のコピーが1つだけで、食べ物のコピーが1つしかないため、重複はありません)。

これが正規形に関する記事です

于 2012-12-24T03:21:34.183 に答える
0

アイテムを含む FOOD テーブルが必要です。PERSON がお気に入りを 1 つしか持てない場合は、FOOD への外部キーで十分です。お気に入りが多数存在する可能性がある場合は、JOIN テーブルが必要です。

于 2012-12-24T03:00:32.720 に答える
0

テーブルを正規化するときは、次のことを自問する必要があります。何種類のデータを扱っているか?

この場合、人の名前と食品の 2 種類のデータがあります。さらに細かく分けると、人の名前は姓と名で構成されていると言えますが、これには 2 種類のデータがあれば十分であると言えます。

そのため、人、食べ物用のテーブルが必要で、それをすべてまとめるテーブルが 1 つ必要です。したがって、次のようなものです。

Person
+--------+---------------+--------------+
|   id   |   firstname   |   lastname   |
+--------+---------------+--------------+
|   1    |   James       |   Bonds      |
|   2    |   David       |   Smith      |
+--------+---------------+--------------+
Food
+--------+---------------+
|   id   |   name        |
+--------+---------------+
|   1    |   BBQ         |
|   2    |   Hamburger   |
|   3    |   Pizza       |
+--------+---------------+
FoodFavorites
+--------+---------------+--------------+
|   id   |   person_id   |   food_id    |
+--------+---------------+--------------+
|   1    |   1           |   1          |
|   2    |   1           |   2          |
|   3    |   1           |   3          |
|   4    |   2           |   1          |
|   5    |   2           |   3          |
+--------+---------------+--------------+

そして、次のように新しい値を挿入できます。

$sql = "INSERT INTO FoodFavorites (person_id, food_id) VALUES ($person_id, $food_id)";
于 2012-12-24T03:38:29.140 に答える