Arrays vs Tables (PHP/MySQL)

2022-08-30 17:16:36

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

enter image description here

他正在使用一个非常常见的设置,MySQL和PHP将表单提交保存在一个看起来像这样的表中:

enter image description here

selection是味道的ID。这些风格存储在PHP数组中,因为他计划在以后的页面中使用青睐列表:

$flavors = array(
   1=>"Chocolate",
   2=>"Cherry",
   ....
);

表格很成功,他的朋友开始要求吉米添加新的选项,所以吉米决定把它带到一个新的水平,并在表格中添加国家,年龄,电子邮件和其他东西,但这次他怀疑把口味名称放在一个更好的主意, 国家,年龄和其他静态数据在数组中或将它们中的每一个保存在数据库表中,他无论如何都知道如何在查询中进行联接。

第一种方法

这意味着拥有一个包含许多数组的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 关联的静态数据(如口味名称、国家/地区、年龄组等)的最佳方式是什么?

给定的环境细节:

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

提前感谢您帮助他。


答案 1

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


答案 2

我认为吉米应该考虑他想如何列出他的数据。为什么要把他的征服限制在口味上。

如果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似乎对数据库了解很多,因此每当他想添加一些东西时,他都可以根据需要添加另一列(或表)。此外,如果我们包装一个甜蜜的用户系统,他可以在将来的其他项目中重用它!


推荐