【问题标题】:Best way to store a category name from php in a mysql table将php中的类别名称存储在mysql表中的最佳方法
【发布时间】:2014-10-08 05:53:11
【问题描述】:

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

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

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

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

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

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

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

数据库看起来像这样:

项目

  • INT id(主要)
  • INT category_id(索引)

类别

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

缺点(对我而言):

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

Mysql 枚举

数据库看起来像这样:

项目

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

优点是去掉了第一种方案的双表查询,但是数据还是重复的,对数据库的负担比以往任何时候都大。

items 表中的字符串字段

数据库看起来像这样:

项目

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

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

所以,问题...

就性能和/或可维护性而言,最好的方法是什么?还有其他更好的方法吗?

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

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

【问题讨论】:

    标签: php mysql indexing


    【解决方案1】:

    视情况而定,

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

    我采用了之前添加 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 是王牌) 3)。如果您使用辅助表,则(如您所指出的)必须首先从该表中查找值,然后插入,或者如果在下拉列表中使用了类别,请使用类别 ID 及其名称来填充下拉列表(我会这样做)

    最后的想法

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

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

    希望对你有帮助,祝你好运

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

    【讨论】:

    • 如果我使用该解决方案,我所说的“播种”将被更新数据库结构的迁移所取代,所以没问题。感谢您在这里发帖。
    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多