复选框,PHP和MySQL的性能和维护

时间:2016-09-19 17:15:22

标签: php mysql performance checkbox

假设我有一个带有如下用户表的MySQL数据库:

|ID| Name| email       |...
|1 | John| john@doe.com|...

我将有一个php页面,用户可以在两个独立兴趣区域的不同选项之间选择复选框。对于这个例子,我们可以说:最喜欢的水果和汽车。

水果:苹果,柠檬,梨,香蕉。 汽车:法拉利,梅赛德斯,沃尔沃,宝马。

现在我有两种可能性:

1。)为每个水果和每个与每个用户相关的汽车创建一个列,如下所示:

|ID| Name| email       |apple | lemon | pear | banana | ferrari | mercedes | volvo | BMW |
|1 | John| john@doe.com| 1    | 1     | 0    | 1      | 0       | 1        |  0    | 1   |

2)创建两个新表:水果和汽车。

|ID| Name  |
| 1| Apple |
| 2| Lemon |
| 3| Pear  |
| 4| Banana|

|ID| Name     |
| 1| Ferrari  |
| 2| Mercedes |
| 3| Volvo    |
| 4| BMW      |

然后创建一个名为user_fruit的关系表,另一个名为user_cars。 E.g:

|ID_user| ID_fruit |
| 1     | 1        |
| 1     | 2        |
| 1     | 4        |

(请注意,水果ID 3,Pear未显示为未选中 - > 0)

|ID_user| ID_car   |
| 1     | 2        |
| 1     | 4        |

问题: 我不知道哪种方法更好?第一个是第一手容易的,但是一旦选项增长,该表将包含许多 tinyint 列。 第二个在开始时对所有关系都比较困难,但是更容易维护,除非用户取消选中一个选项,我觉得通过php删除行感觉不太舒服,特别是在基于索引的表上。

我不知道是否有人遇到过类似的任务,可以给我一些建议。

我真的不需要任何代码示例,因为我知道如何开发这两个选项,更多的是我正在寻找的性能和维护方法。

干杯!

4 个答案:

答案 0 :(得分:5)

绝对是第二种方法。看看database normalization。正如您所指出的那样,在您的第一种方法中,您最终会得到一个包含许多“空”值的表,并且以后很难修改。

答案 1 :(得分:1)

由于我讨厌有多个“只有10个条目”的表,我只是决定编码ID

|ID    | Name     |
| 1001 | Ferrari  |
| 1002 | Mercedes |
| 1003 | Volvo    |
| 1004 | BMW      |
| 2001 | Apple    |
| 2002 | Lemon    |
| 2003 | Pear     |
| 2004 | Banana   |

然后代码“知道”2xxx是水果,1xxx是汽车等。你甚至可以有一个id-filter表来减轻负担

|ID    | Family  |
| 1000 | Cars    |
| 2000 | Fruits  |

当你有大量的小“选项”表时,这会减少大的JOIN ... JOIN ... JOIN语句。这是一个很好的性能,代价是更大的ID空间要求(SMALLINT而不是TINYINT)

不是真正的数据库专家,但是错误安全,你可以随时拆分表。

答案 2 :(得分:0)

第二个是在两个表上使用外键的最佳和专业方式。这样就可以避免使用空值。

答案 3 :(得分:0)

以第一种可能的方式,

void foo(int i, int j, const std::function<int(int, int)> f) { /* ... */ }

// ...

const auto foo1 = std::bind(foo, std::placeholders::_1, std::placeholders::_2, f1);
const auto foo2 = std::bind(foo, std::placeholders::_1, std::placeholders::_2, f2);

您必须只读取一行,然后您可以获取数据,而另一种方式是读取多个表和多行。此外,还有另一种称为数据复制的场景概念 - 您使用表/数据的方法必须规范化。你可以阅读this with this link

希望这对您的决定有所帮助。干杯