【问题标题】:Arrays vs Tables (PHP/MySQL)数组与表(PHP/MySQL)
【发布时间】:2011-07-28 01:27:41
【问题描述】:

认识吉米。他制定了新的人生目标,以证明巧克力是有史以来最好的冰淇淋口味。为此,他构建了一个带有单选按钮和名称文本字段的简单表单,以便他可以将链接发送给他的朋友。

他正在使用一种非常常见的设置,MySQL 和 PHP 将表单提交保存在如下所示的表中:

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 来说是一个重要的决定,因为他想在未来构建更多更大的形式。

Jimmy 处理与数据库中的 ID 相关联的静态数据(例如风味名称、国家/地区、年龄组等)的最佳方式是什么?

鉴于环境细节:

  1. 数组是静态的,几乎永远不会改变
  2. 他将在几页上使用数据,所以硬编码不方便
  3. 添加新数组通常更快

提前感谢您帮助他。

【问题讨论】:

  • 吉米统治世界计划+1
  • 聪明,但看起来很像家庭作业。如果这不是家庭作业,我建议您明确说明,否则很快就会出现反对意见。
  • @Michael 谢谢,但实际上这是在工作中提出的,与同事进行了真正的讨论,但我想我会用一种不那么无聊的方式来写这个问题
  • 以参照完整性将所有内容存储在数据库中。为什么?假设你想在某个时候去除一种味道......
  • 这让我很开心。你把一个无聊的问题弄得很有趣,哈哈。好吧,选择数据库方法。从长远来看,这将更加高效且易于管理。

标签: php mysql


【解决方案1】:

第二个选项当然更具可扩展性,几乎在各个方面都更好,唯一的论点可能是性能,因为他的数据最终会变得非常大。但即使在那个时候,jimmy 也可以使用 memcache、x-cache 之类的技术轻松地缓存来自新风味表的结果,甚至可以编写代码,使用风味数据库动态创建具有风味数组的 php 文件。我很困惑为什么像你这样的人会问这样的问题?!​​

【讨论】:

  • 即使拥有 24k 的声誉,我仍然什么都不知道,所以当 4k 用户提出经过深思熟虑的问题时,我一点也不感到困惑 ;)
  • @Tatu 我没有暗示什么,我只是觉得这看起来像是家庭作业什么的,他没有太多讨论什么让他问。我不认为他在制作冰淇淋投票软件。
【解决方案2】:

我认为 Jimmy 应该考虑他想如何布置他的数据。为什么要将他的征服限制在口味上。

如果 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 似乎对数据库了解很多,因此只要他想在其中添加一些内容,他就可以根据自己的需要添加另一列(或表)。另外,如果我们封装了一个好的用户系统,他可以在未来的其他项目中重用它!

【讨论】:

    【解决方案3】:

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

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

    ...但您必须记住在任何使用它的函数中都包含全局变量。

    这样做的好处:只有一次数据库查找,全局访问。 这样做的缺点:如果数组很大,则会占用内存

    【讨论】:

    • 缺点:全局变量很糟糕
    • 哦!但在这种情况下,它们是否比对相同数据的重复 SQL 查询吸收更少?我也很好奇你会用什么。
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多