数组 vs 表格(PHP/MySQL)

25

介绍一下Jimmy,他的新人生目标是证明巧克力是最好的冰淇淋口味。为此,他建立了一个简单的表单,包含单选按钮和一个用于输入名字的文本字段,以便将链接发送给朋友。

enter image description here

他正在使用非常常见的设置,MySQL 和 PHP 将表单提交保存在类似以下这样的表格中:

enter image description here

selection 是口味的 ID。这些口味存储在 PHP 数组中,因为他计划在未来的页面中使用这个口味列表:

$flavors = array(
   1=>"Chocolate",
   2=>"Cherry",
   ....
);
表单成功了,他的朋友们开始要求Jimmy添加新选项,所以Jimmy决定将表单升级到下一个级别,并添加国家、年龄、电子邮件等信息,但这次他怀疑是将口味名称、国家、年龄和其他静态数据保存在数组中,还是将它们保存在数据库表中更好。无论如何,他知道如何在查询中进行连接。

第一种方法

意味着有一个包含许多数组的PHP文件,并且每当Jimmy需要使用味道名称时,就要访问它,例如:

$query = mysql_query("SELECT name, flavor FROM votes")
while($row = mysql_fetch_assoc($query)){
   echo $row["name"]." - ".$flavors[$row["flavor"]];
}

第二种方法

意味着在数据库中有许多表,并且每次需要像这样的名称时都需要执行连接操作:

$query = mysql_query("SELECT name, flavor FROM votes LEFT JOIN flavors 
WHERE votes.flavor = flavors.flavor");

while($row = mysql_fetch_assoc($query)){
   echo $row["name"]." - ".$row["flavor"];
}

虽然看起来差别不大,但这对 Jimmy 来说是一个重要的决定,因为他希望在未来构建更多、更大的表单。

对于与数据库中的 ID 相关联的静态数据(如口味名称、国家、年龄组等),Jimmy 最好如何处理?

给出环境细节:

  1. 数组是静态的,几乎不会改变
  2. 他将在多个页面上使用这些数据,因此硬编码不方便
  3. 添加新数组通常更快

感谢您提前帮助他。


9
支持Jimmy的全球统治计划,+1。 - Andreas Wong
聪明,但看起来非常像作业。如果这不是一项作业任务,我建议您明确说明,否则很快就会被踩。 - Michael Berkowski
3
@Michael 谢谢,但实际上这是在工作中出现的,与同事进行了真正的讨论,但我想以一种不那么无聊的方式来写问题。 - amosrivera
1
将所有内容存储在具有引用完整性的数据库中。为什么?假设您想在某个时候删除一种口味... - Phil
5
太棒了!你把一个无聊的问题变得非常有趣,哈哈。好的,选择数据库方法吧。长期来看,这将更有效率且易于管理。 - Jimmie Lin
3个回答

4
第二个选项当然更加可伸缩,并且在各个方面几乎更好,唯一的争议可能是性能问题,因为他的数据最终会变得非常大。但即使在那个时候,Jimmy也可以轻松地使用像memcache、x-cache这样的技术来缓存新口味表的结果,或者编写一个代码,动态地使用flavores数据库创建包含口味数组的php文件。我很困惑为什么有你这样的声誉的人会问这样的问题?!

3
即使我有2.4万的声望,我仍然不知道所有的事情,所以当一个声望只有4千的用户提出一个深思熟虑的问题时,我并不感到困惑。 ;) - Tatu Ulmanen
@Tatu,我并没有暗示什么,只是觉得这看起来像作业之类的东西,他也没有讨论关于他提问的原因。我不认为他在制作一个冰淇淋投票软件。 - Neo

3

我认为Jimmy应该考虑如何布置他的数据,不仅局限于flavors。

如果Jimmy想要存储许多小的数据位,数据库是最佳选择。如果Jimmy想要存储物品的图像,则应该将它们存储在文件中,并将它们的相对位置存储在数据库中的某个根目录中。

也许一个表格可以包含:

VOTE_ITEMS
    ID - PRIMARY KEY
    NAME
    IMAGE
    TAGS - (Maybe an imploded ID array with the IDs pointing to a TAG table)
    ...

另一个表格可以包含:

USERS
    ID - PRIMARY KEY
    ...
    (As much information as your want to collect from your users)
    ...

关于投票:
POLLS
    ID
    VOTE_ITEM_IDS
    ...

USER_VOTES
    POLLS_ID
    VOTE_ITEM
    USER_ID

由于Jimmy似乎对数据库非常了解,所以只要他想添加一些内容,他就可以根据自己的需求添加另一个列(或表)。此外,如果我们包装了一个好用的用户系统,他将来可以在其他项目中重复使用它!


2

我倾向于将这样的值存储在数据库表中,主要是为了可以通过CMS进行修改。 然后,我只会在我的PHP代码的开头附近一次性地检索它们,放入全局数组中...例如$glob['flavors']、$glob['cities']等。然后,就像这样简单...

    foreach ($person) {
        echo 'Their flavor = '. $glob['flavors'][$person['flavor_id']];
    }

...但是你必须记得在任何将使用它的函数中包含全局变量。

这样做的好处:只需要进行一次数据库查询,就可以访问全局变量。 这样做的缺点:如果数组很大,会占用大量内存。


缺点:全局变量很糟糕 - wonk0
哦!但在这种情况下,它们是否比重复的SQL查询更好?我也很好奇你会使用什么。 - designosis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接