如何在表中存储用户选择的多个选项


How to Store Multiple Options selected by User in a Table

所以我希望我的用户能够限制谁可以联系他们。

他们应该能够过滤几个因素,包括年龄(例如必须在18 - 29岁之间),收入(必须在25,000 - 60,000美元之间),他们在寻找什么(例如友谊,闲逛等),他们吸食什么毒品(大麻,冰毒,可卡因等),等等。

问题是,我希望他们能够选择和存储多个选择的一些标准(例如药物),但我不知道我应该如何在数据库中存储,或者我应该如何构建表来最好地完成这一点。

例如,如何在上下文中存储"毒品"选择"大麻"、"可卡因"answers"海洛因"的用户行?我会简单地将这些以逗号分隔的值存储在"Drugs"列中吗?或者我应该用一种完全不同的方式来做?

最好的方法是什么(考虑到每次用户想要联系另一个用户时,我显然必须检索并检查此信息),为什么?

不可以,不要以CSV格式存储在数据库中。相反,创建一个名为user_drug的连接表,并为每个用户/药物组合存储一行:

user
id    name  income
1     Foo   10000
2     Bar   20000
3     Baz   30000
drug
id    name
1     Marijuana
2     Cocaine
3     Heroin
user_drug
user_id drug_id
1       1
1       2
2       1       
2       3
3       3

一个DB列(至少理论上)应该NOT保存多个值。不幸的是,有一些程序员在一个列中存储多个值(例如,用逗号分隔的值)—这些程序员(在大多数情况下)破坏了DB和SQL的概念。

我建议您阅读Database Normalization以开始组织您的表。并且,尽你所能达到Codd的第三范式

你可以试试:

criterium
------------
user_id type          value
1       AGE_MIN       18
1       AGE_MAX       29
1       INCOME_MIN    25000
1       INCOME_MAX    60000
1       DRUGS         Marijuana
1       DRUGS         Meth