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



假设我有一个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)创建两个新表:fruits和cars。

|ID| Name  |
| 1| Apple |
| 2| Lemon |
| 3| Pear  |
| 4| Banana|
|ID| Name     |
| 1| Ferrari  |
| 2| Mercedes |
| 3| Volvo    |
| 4| BMW      |

然后创建一个名为user_fruit的关系表和一个名为user_cars的关系表。例句:

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

(注意水果id为3,梨没有出现,因为它没有被选中-> 0)

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

问题:我不知道哪种方法更好?第一个方法在第一次使用时很容易,但是一旦选项增加,表将有很多tinyint列。对于所有的关系,第二种方法在开始时比较困难,但更容易维护,除了当用户取消选中一个选项时,我觉得用php删除行不是很舒服,特别是在基于索引的表上。

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

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

干杯!

肯定是第二种方法。看一看数据库规范化。正如您所注意到的,在第一种方法中,您最终会得到一个包含许多"null"值的表,并且以后很难修改。

因为我讨厌有多个"只有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语句。这在性能方面很好,但代价是需要更大的ID空间(SMALLINT而不是TINYINT)

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

第二种方法是在两个表上使用外键的最好和专业的方法。这样可以避免null值

首先,

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

你将不得不只读取一行,然后你可以抓取数据,而在另一种方式,你读取多个表和多个行。此外,对于这种场景还有另一个概念,称为数据复制-无论您使用哪种方法,都必须规范化表/数据。你可以通过这个链接阅读相关内容。

希望这对你的决定有帮助。欢呼声

最新更新