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

Php 如何在表中存储用户选择的多个选项,php,mysql,database,database-design,Php,Mysql,Database,Database Design,所以我希望我的用户能够限制谁可以联系他们 他们应该能够过滤几个因素,包括年龄(例如必须在18-29岁之间)、收入(必须在25000-60000美元之间)、他们在寻找什么(例如友谊、闲逛等)、他们使用什么药物(大麻、冰毒、可卡因等) 问题是,我希望他们能够选择并存储一些标准的多个选项(例如药物),但我不知道应该如何将其存储在数据库中,或者我应该如何构造表以最好地实现这一点 例如,我将如何存储在该上下文中为“毒品”选择“大麻”、“可卡因”和“海洛因”的用户行?我会简单地将这些值作为逗号分隔的值存储在

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

他们应该能够过滤几个因素,包括年龄(例如必须在18-29岁之间)、收入(必须在25000-60000美元之间)、他们在寻找什么(例如友谊、闲逛等)、他们使用什么药物(大麻、冰毒、可卡因等)

问题是,我希望他们能够选择并存储一些标准的多个选项(例如药物),但我不知道应该如何将其存储在数据库中,或者我应该如何构造表以最好地实现这一点

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


这样做的最佳方式是什么(考虑到每次用户想要联系另一个用户时,我都必须检索和检查此信息)以及原因是什么?

不,不要将值以CSV格式存储在数据库中。而是创建一个名为
user\u 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

否,不要将CSV格式的值存储在数据库中。而是创建一个名为
user\u 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
您可以尝试以下方法:

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
您可以尝试以下方法:

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
DB列(至少在理论上)不应包含多个值。不幸的是,有些程序员在一列中存储多个值(例如,值之间用逗号分隔)——这些程序员(在大多数情况下)破坏了DB和SQL的概念

我建议你阅读一下,开始整理你的桌子。并且,尽最大努力实现一个DB列(至少在理论上)不应包含多个值。不幸的是,有些程序员在一列中存储多个值(例如,值之间用逗号分隔)——这些程序员(在大多数情况下)破坏了DB和SQL的概念


我建议你阅读一下,开始整理你的桌子。并且,尽最大努力实现有趣的

。但是主表有所有的限制,而不仅仅是药物(这只是一个“列”)?谢谢编辑,但我仍然感到困惑。我需要创建一个新的限制表,它将为每个用户的限制设置一列。这些列将包括年龄、收入、寻找、药物等。其中一些列(寻找、药物等)可能包含多项选择。我仍然不明白如何以这种方式构造表限制。对不起,我很忙,我非常感谢您的帮助。@Programmer:对于每个可以包含多个值的“列”,您需要一个单独的联接表。尽管我认为对于年龄和收入来说,最小值和最大值应该足够了。你不同意吗?寻找21-30或41-50而不是31-40似乎有点奇怪…好的,所以我需要为每个多选列创建一个联接表。知道了。例如,我看到您是如何构造user_drug join表的,但是限制表上的drug列是什么样子的?(我从未处理过联接表)限制表上没有药物列。所有值都存储在联接表中。但是主表有所有的限制,而不仅仅是药物(这只是一个“列”)?谢谢编辑,但我仍然感到困惑。我需要创建一个新的限制表,它将为每个用户的限制设置一列。这些列将包括年龄、收入、寻找、药物等。其中一些列(寻找、药物等)可能包含多项选择。我仍然不明白如何以这种方式构造表限制。对不起,我很忙,我非常感谢您的帮助。@Programmer:对于每个可以包含多个值的“列”,您需要一个单独的联接表。尽管我认为对于年龄和收入来说,最小值和最大值应该足够了。你不同意吗?寻找21-30或41-50而不是31-40似乎有点奇怪…好的,所以我需要为每个多选列创建一个联接表。知道了。例如,我看到您是如何构造user_drug join表的,但是限制表上的drug列是什么样子的?(我从未处理过联接表)限制表上没有药物列。所有的值都存储在联接表中。如何有两个同名列?这是枚举值(“年龄最小”、“年龄最大”、“收入最小”、“收入最大”、“药物…”),所以id为1的用户有药物“大麻”和“Meth”的标准。我不熟悉“枚举值”。考虑到某些值可以有多种选择(例如药物、寻找等),您如何以这种方式构建限制表?表示此列中的一条记录将仅具有枚举列表中的一个值。在多选中,您需要插入多条记录(如我的示例中的最后两条记录)。也许这不是最好的解决方案,但很容易实现,而且只需要一个表。如何有两个同名列?这是枚举值(“年龄最小”、“年龄最大”、“收入最小”、“收入最大”、“药物”),所以id为1的用户有药物“大麻”和“Meth”的标准。我不熟悉“枚举值”。考虑到某些值可以有多种选择(例如药物、寻找等),您如何以这种方式构建限制表?表示此列中的一条记录将仅具有枚举列表中的一个值。在多选中,您需要插入多条记录(如我的示例中的最后两条记录)。也许这不是最好的解决方案,但很容易实现,而且只需要一个表。