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 行具有相同名字的行,依此类推)。

问题是如果我需要更改用户的信息,我必须一个一个地更改它,这是错误的。如果我要删除用户信息,训练列的值也应该一次性删除。(我不能使用内爆或爆炸)。对不起。php新手。

提前致谢。

4

4 回答 4

2

你应该有三个表:

Person Table (person_id, firstname, lastname)

Food Table (food_id, name)

PersonFood Table (person_id, food_id)

插入记录时,将人员详细信息输入到人员表中。将食物详细信息存储在食物表中。当一个人喜欢某种食物时,将一条记录添加到 PersonFood 表中,该表将包含 person_id 和 food_id。这样,当人员详细信息更改时,您只需更改人员表中的记录。检索结果时,您可以进行联接查询。

这种归一化形式称为第三范式

于 2012-12-24T03:02:34.677 回答
0

这是 N:N 关系。

N人存在

N种食物存在

任何人都可以想要任何食物。

你写的表的问题是这样的:

  1. 假设您删除了詹姆斯邦德。汉堡包现在已从表中删除。但是汉堡仍然存在,但在你的桌子上看起来它不存在(明白吗?)

  2. 假设我选择了所有喜欢披萨和汉堡的人。詹姆斯邦兹的名字会出现两次这是错误的,因为他是一个人

....我可以继续指出您上面描述的概念的方法。

如何规范化它

你应该有 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 行会删除上面指出的所有异常(注意现在只有一份人名和一份食物副本,因此没有重复)

是一篇关于范式的文章

于 2012-12-24T03:21:34.183 回答
0

我会有一个 FOOD 表,里面有物品。如果 PERSON 只能有一个收藏夹,那么 FOOD 的外键就足够了。如果可以有很多收藏夹,则需要一个 JOIN 表。

于 2012-12-24T03:00:32.720 回答
0

在对表格进行规范化时,您需要问自己:我要处理多少种数据?

在这种情况下,您有两种数据:一个人的姓名和一个食物项目。可以通过说一个人的名字由名字和姓氏组成来进一步分解它,但是为此我们只说两种数据就足够了。

所以,我们需要一张桌子来放人、食物,然后一张桌子把它们放在一起。所以,像这样:

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 回答