搜索友好的方式来存储MySQL中的复选框值?

时间:2009-08-29 23:14:30

标签: database search checkbox

什么是在数据库中存储复选框值的搜索友好方式?

目前,复选框被处理为数组,值以“;”

分隔

因此:

<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)并将字符串添加到数据库中。

这种方法很好,但在搜索时却是一场噩梦。

有没有更好的方法来解决这个问题?

7 个答案:

答案 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
  • 如果您的数据库存储了12,那么您知道它是每周和每周每月
  • 如果您的数据库存储了4,那么您知道它是每周
  • 如果您的数据库存储了10,那么您知道它是每日&amp;每月
  • 等等。

此技术可用于将多个信息打包在一个总和中。保存空间和提高性能(处理整数而不是字符串)会很有用。另一方面,它涉及更多的开发开销。

另一种快速且不可扩展的方法是简单地使用三个不同的位/布尔列(1或0),但请注意,如果您要添加新选项,这将无法很好地扩展。

答案 2 :(得分:1)

  

这种方法很好,但在搜索时却是一场噩梦。

其他人在这里有很好的答案,但我建议你稍微改变一下这个问题。如果你不能搜索它怎么样“工作正常”?这有点像说“写入/ dev / null很棒,但阅读是一个问题”。

我建议您首先考虑一下如何使用这些信息(即它对业务的重要性),然后考虑从用户那里收集哪些信息,然后考虑如何存储它以便它可以服务目的。直接跳到第3步是很诱人的,因为在大多数情况下它是“显而易见的”,但是当你遇到一个不那么明显的情况时,回到开头,解决方案就会清楚。

最好至少考虑使用这些信息的几种方法。这有助于避免过度特定的数据表示。还要避免过度热心“让我们收集这些信息是为了安全起见”。这会导致许多可选信息与业务没有明确的联系,从而导致对其含义的误解。当它查询信息的时候,你就会一团糟。

答案 3 :(得分:0)

您有两个选择,

  1. 使用第二个表存储频率。类似的东西:

    CREATE TABLE `frequencies` (
        `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
        `order_id` INT NOT NULL ,
        `frequency` ENUM( 'Daily', 'Weekly', 'Monthly' ) NOT NULL
    )
    
  2. 为每个频率创建一个字段。我不推荐这种方法。

答案 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的幂,并且在搜索时存储它们的总和,例如为了查看是否设置了几个选项中的一个,则不允许使用索引。 如果我们将函数应用于字段,则无法使用索引。