【问题标题】:normalizing table标准化表
【发布时间】:2012-12-10 14:13:58
【问题描述】:

我有一张这样的桌子:

+--------+---------------+--------------+---------------+
|   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新手。

提前致谢。

【问题讨论】:

    标签: php html database phpmyadmin normalization


    【解决方案1】:

    你应该有三个表:

    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

    【讨论】:

    • 我已经完成了 3 个表,我想我被困在放置 JOIN 语句的位置。这是我要使用的语句: SELECT person.firstname, person.lastname, food.name FROM personfood JOIN person ON personfood.person_id = person.person_id JOIN food ON personfood.food_id = food.food_id
    • 我已经这样做了。多谢。但我的最后一个问题是当我添加新值时,显示中没有任何反应。其他人游戏我这个语句: $sql = "INSERT INTO FoodFavorites (person_id, food_id) VALUES ($person_id, $food_id)";对于第三张表,我将添加新值。但有一个错误。 $person_id 和 food_id 中未定义的变量。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是 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 行会删除上面指出的所有异常(注意现在只有一份人名和一份食物,所以没有重复)

      Here 是一篇关于范式的文章

      【讨论】:

      • 谢谢...但是现在如果我添加其他信息,PersonFood_Join 中没有任何反应。我认为这将是一个 INSERT 语句。但我不知道该怎么做。提前致谢
      • 您必须编写 2 个插入语句。插入人。插入到 PersonFood_Join。在第二个插入中使用从第一个生成的 id。虽然这更复杂,但逻辑上更好
      • 您能否显示代码...因为此代码不起作用并且$sql4 = "INSERT INTO PersonFood_Join (food_id) (SELECT food_id FROM Food)";(此代码复制插入的 id)。这是因为我认为 Food 表同时接受多个值,这是我的代码无法做到的。
      【解决方案4】:

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

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

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

      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)";
      

      【讨论】:

      • INSERT 语句出现错误。未定义的变量 person_id 和 food_id。
      • 我需要用POST之类的东西声明变量,它们的值必须来自person table和food table的id。
      猜你喜欢
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 2010-09-19
      相关资源
      最近更新 更多