【问题标题】:Checkboxes, PHP and MySQL performance and maintenance复选框、PHP 和 MySQL 性能和维护
【发布时间】:2017-01-27 11:10:16
【问题描述】:

假设我有一个带有如下用户表的 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 删除行不太舒服,特别是在基于索引的表上。

不知道有没有人遇到过类似的任务,能给我一些建议。

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

干杯!

【问题讨论】:

    标签: php mysql performance checkbox


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我担心当用户取消选择其中一个选项时,我需要删除关系表中的完整行,对吗?或者还有其他我想念的方式吗?
    • 可能,但请看一下与 MySQL 表声明相关的术语“级联”。 “在删除级联...”
    【解决方案2】:

    因为我讨厌有多个“只有 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)

    不是真正的数据库专业版,但可以防错,您可以随时拆分表。

    【讨论】:

    • 嗯!有趣!
    【解决方案3】:

    第二种是最好和专业的方法,在两个表上都有一个外键。这样你可以避免空值。

    【讨论】:

      【解决方案4】:

      第一种可能的方式,

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-08
        • 2014-06-11
        相关资源
        最近更新 更多