我想知道如何在数据库中显示多个值,例如,假设您有一个用户将填写一个表单,要求他们输入他们喜欢的食物类型,例如饼干,糖果,苹果,面包等。
如何将它存储在名为food的同一字段下的MySQL数据库中?
野外食物结构如何?
答案 0 :(得分:4)
您可能需要阅读the excellent Wikipedia article on database normalization。
您不希望在单个字段中存储多个值。你想做这样的事情:
form_responses
id
[whatever other fields your form has]
foods_liked
form_response_id
food_name
其中form_responses
是包含单数事物的表(如人的姓名或地址,或者没有多个值的事物)。 foods_liked.form_response_id
是对form_responses
表的引用,因此响应数为6的人喜欢的食物对form_response_id
中的foods_liked
字段的值为6。对于每个人喜欢的食物,你会在该表中排成一行。
编辑:其他人建议使用三表结构,如果限制用户从预定义列表中选择食物,这肯定会更好。在你允许他们输入自己的食物的情况下,三桌结构可能会更好,但是如果你走这条路线你会想要小心你的输入正常化(修剪空白,修复大写等等)。 )所以你不会在那个表中找到重复的条目。
答案 1 :(得分:2)
表1:tbl_food
ID primary key, auto increment
FNAME varchar
表2:tbl_user
ID primary key, auto increment
USER varchar
表3:tbl_userfood
RID auto increment
USERID int
FOODID int
使用类似的格式存储您的数据,而不是将一大块数据放入字段中。
查询这些表比解析数据块更容易。
答案 2 :(得分:1)
使用标准化。
更具体地说,创建一个名为users的表。创建另一种叫做食物。然后将这两个表与一个名为users_to_foods的多对多表连接在一起,引用彼此的外键。
答案 3 :(得分:0)
一种方法是用您的编程语言序列化食物数据,然后将其存储在食物领域。这将允许您查询数据库,获取序列化的食物数据,并使用您的编程语言将其转换回本机数据结构(在本例中可能是一个数组)。
这种方法的问题在于,您将反复存储大量相同的数据,例如:如果很多人喜欢cookies,字符串“cookies”将被反复存储。另一个问题是寻找喜欢某种特定食物的每个人。为此,您必须为每条记录选择食物数据,对其进行反序列化,并查看所选食物是否包含在其中。这是非常低效的。
相反,您需要创建3个表:用户表,食物表和连接表。用户和食物表将分别包含每个用户和食物的一条记录。联接表将包含两个字段:user_id
和food_id
。对于用户选择的每种食物,它会在用户ID和食物ID的连接表中添加记录。
例如,为了吸引所有喜欢ID为FOOD_ID的特定食物的用户,您的查询将是:
SELECT users.id, users.name
FROM users, join_table
WHERE join_table.food_id = FOOD_ID
AND join_table.user_id = users.id;