我有一张这样的表:
+--------+---------------+--------------+---------------+
| 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。
提前致谢。
答案 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种食物
任何人都可以要任何食物。
您写的表的问题是:
让我们说你删除詹姆斯邦兹。现在从表中删除汉堡包。但汉堡仍然存在,但在你的表中,它看起来不是(理解?)
假设我选择了喜欢Pizza和Hamburger的所有人。詹姆斯邦兹的名字将出现两次,这是错误的,因为他是一个人
....我可以继续用上面描述的概念指出方法。
如何规范化
你应该有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)";