规范化表

时间:2012-12-24 02:57:06

标签: php html database phpmyadmin normalization

我有一张这样的表:

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

问题是如果我需要改变用户的信息,我必须逐一改变它,这是错误的。如果我要删除用户信息,也应该同时删除训练列值。(我不能使用implode或explode)。 对不起。新的PHP。

提前致谢。

4 个答案:

答案 0 :(得分:2)

你应该有三张桌子:

Person Table (person_id, firstname, lastname)

Food Table (food_id, name)

PersonFood Table (person_id, food_id)

插入记录时,请在人员表中输入人员详细信息。将食物细节存储在食物表中。当一个人喜欢食物时,在PersonFood表中添加一条记录,其中包含person_id和food_id。这样,当人员细节发生变化时,您只需要更改人员表中的记录。 检索结果时,您可以进行连接查询。

此类规范化表单称为Third normal form

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这是N:N关系。

N人存在

存在N种食物

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

您写的表的问题是:

  1. 让我们说你删除詹姆斯邦兹。现在从表中删除汉堡包。但汉堡仍然存在,但在你的表中,它看起来不是(理解?)

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

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

    如何规范化

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

    Here是关于普通表格的文章

答案 3 :(得分: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)";