什么是在数据库中存储复选框值的搜索友好方式?
目前,复选框被处理为数组,值以“;”
分隔因此:
<input type="checkbox" name="frequency[]" value="Daily"/> Daily
<input type="checkbox" name="frequency[]" value="Weekly"/> Weekly
<input type="checkbox" name="frequency[]" value="Monthly"/> Monthly
PHP后端运行implode(';',$ frequency)并将字符串添加到数据库中。
这种方法很好,但在搜索时却是一场噩梦。
有没有更好的方法来解决这个问题?
答案 0 :(得分:5)
正如关于关系数据库的许多其他问题一样,最好的答案是normalization。
多值属性需要在多行上存储值:
CREATE TABLE Frequency (
form_id INT NOT NULL,
frequency VARCHAR(7) NOT NULL,
PRIMARY KEY (form_id, frequency),
FOREIGN KEY (form_id) REFERENCES FormSubmissions(form_id),
FOREIGN KEY (frequency) REFERENCES FrequencyValues(frequency)
);
答案 1 :(得分:1)
您可以将权力2赋予每个值,并存储它们的总和。然后从该总和中,您可以使用mod运算符回溯使用简单算法选择的内容。
例如:
<input type="checkbox" name="frequency[]" value="2"/> Daily
<input type="checkbox" name="frequency[]" value="4"/> Weekly
<input type="checkbox" name="frequency[]" value="8"/> Monthly
此技术可用于将多个信息打包在一个总和中。保存空间和提高性能(处理整数而不是字符串)会很有用。另一方面,它涉及更多的开发开销。
另一种快速且不可扩展的方法是简单地使用三个不同的位/布尔列(1或0),但请注意,如果您要添加新选项,这将无法很好地扩展。
答案 2 :(得分:1)
这种方法很好,但在搜索时却是一场噩梦。
其他人在这里有很好的答案,但我建议你稍微改变一下这个问题。如果你不能搜索它怎么样“工作正常”?这有点像说“写入/ dev / null很棒,但阅读是一个问题”。
我建议您首先考虑一下如何使用这些信息(即它对业务的重要性),然后考虑从用户那里收集哪些信息,然后考虑如何存储它以便它可以服务目的。直接跳到第3步是很诱人的,因为在大多数情况下它是“显而易见的”,但是当你遇到一个不那么明显的情况时,回到开头,解决方案就会清楚。
最好至少考虑使用这些信息的几种方法。这有助于避免过度特定的数据表示。还要避免过度热心“让我们收集这些信息是为了安全起见”。这会导致许多可选信息与业务没有明确的联系,从而导致对其含义的误解。当它查询信息的时候,你就会一团糟。
答案 3 :(得分:0)
您有两个选择,
使用第二个表存储频率。类似的东西:
CREATE TABLE `frequencies` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`order_id` INT NOT NULL ,
`frequency` ENUM( 'Daily', 'Weekly', 'Monthly' ) NOT NULL
)
为每个频率创建一个字段。我不推荐这种方法。
答案 4 :(得分:0)
您可以在数据库中设置类型值,如下所示:
insert into myTable set frequency = 'weekly';
insert into myTable set frequency = 'daily,monthly';
选择所有具有“每月”
的行select * from myTable where frequency like '%monthly%'
请注意,使用set type字段时,您没有完全规范化数据库。这本身并不需要成为一个问题(看看MySQL自己使用的表格......它们已被全部使用)。不过,请确保你知道自己在做什么。
正如MySQL documentation所述:
MySQL SET数据类型不是 所有MySQL的完美解决方案 数据库,但可以非常强大 在适当的时候。如果你需要跟踪 给定的属性少于64个 实体并进行比较 不同的实体,MySQL SET 数据类型可能是您的理想选择。
答案 5 :(得分:0)
假设您使用5评级最佳答案,那么您将如何搜索每月和每周频率的订单?我现在能想到的唯一方法是为每个AND值加入相同的表格。
获得每周和每月频率的所有订单的正确方法是什么?
答案 6 :(得分:0)
在我看来,如果stire属性为每个值赋予2的幂,并且在搜索时存储它们的总和,例如为了查看是否设置了几个选项中的一个,则不允许使用索引。 如果我们将函数应用于字段,则无法使用索引。