在php中将类别名称存储在mysql表中的最佳方法

时间:2014-08-14 14:19:43

标签: php mysql indexing

我的项目是一个用PHP编写的网站。使用mysql数据库的js。

我需要存储一个带有“类别”或“类型”的项目(找不到更好的名称)。每个项目只能有一个类别。

每个类别都有一个php和javascript代码使用的“名称”(一种id),如“hat”。

这些“名称”在php / javascript代码中是硬编码的。它们不是用户定义的。有一个已知的清单。可以使用新版本的应用程序获得新的“名称”,最终可以删除一些。

以下是我考虑的解决方案:

具有一对多关系的第二个表

这是我目前正在使用的解决方案。

数据库看起来像这样:

  • INT id(主要)
  • INT category_id(index)

类别

  • INT id(主要)
  • VARCHAR名称(唯一)

下行(对我来说):

  • 我必须将类别存储在数据库中。目前我有一种将所有类别添加到数据库中的种子。但是那样数据至少在两个地方(DRY!),我每次修改时都必须更新播种脚本
  • 当我进行查询时,我必须使用两个表,因为php代码只知道“名称”
  • 当我插入记录时,我必须先执行子请求,以便从“名称”中找到类别ID

Mysql枚举

数据库看起来像这样:

  • INT id(主要)
  • ENUM类别(索引)[帽子,衬衫,袜子......]

它有利于删除第一个解决方案的双表查询,但数据仍然是重复的,并且对数据库的影响比以往任何时候都多。

项目表

中的字符串字段

数据库看起来像这样:

  • INT id(主要)
  • VARCHAR类别(索引)

类别名称直接存储在带有索引的“items”表中。在查询视图中,我的印象是索引的行为方式与我之前使用的第二个表的行为相同(优点是只查询一个表和一个索引而不是两个表和两个索引)

所以,问题......

在表现和/或可维护性方面,最好的方法是什么?还有另一种更好的方法吗?

有完整性约束会很好,但不是必需的。 (我可以用另一种方式处理这个问题)

我找到了以下主题:php mysql - should i add the field "category-name" to a table or not?,但它是关于多对多关系的,看起来它是一个变量类别列表。所以它并不适用于我的情况。

1 个答案:

答案 0 :(得分:0)

取决于,

您将拥有多少个类别,您需要多久更新一次?

我在添加Enum之前采用了这种方法,但是在类中编写了静态方法并在那里存储了有效名称

class Item{


    public static function get_categories()
    {

        // only works in php >=5.4 otherwise use return array('Category1'...);
        return [
          'Category1' => 'Category1',
          'Category2' => 'Category2',
          'Category3' => 'Category3'
        ];
    }

}

执行上述操作,您可以通过Item :: get_categories()轻松访问数组,该数据应对应于数据库中ENUM字段中的值。如果需要添加更多类别,请将它们添加到数据库,然后添加到此功能。您可以使用它来验证用户选择并生成javascript选项。

然而!!!!

你提到填充表格的种子,这将无法轻易为你更新你的ENUM。

我使用ENUM,因为

1)。它很容易设置 2)。它比连接两个表稍微容易一些(但是当你学习它们时JOINS是ace) 3)。如果你使用了一个辅助表,你(如你所指出的那样)必须首先从该表中查找值,然后插入,或者如果在下拉列表中使用了该类别,则使用类别ID及其名称来填充下拉列表(我会这样做)

最后的想法

除非您的网站非常繁忙,否则您将大麦的方式(查找表和ENUM)的性能甚至会发现差异。您仍然需要以两种方式更新每个版本的类别表,但使用INSERT语句而不是ALTER TABLE会更容易

无论您选择哪种方式,如果您不喜欢它,更新代码都会非常容易。

希望这有帮助,祝你好运

记住保持简单愚蠢的K.I.S.S

相关问题