Enum vs Reference表vs Lookup类

Pui*_*ber 13 php mysql lookup enums

当我为约会网站设计MySQL数据库时,我怀疑如何存储引用的数据.目前,该数据库有33个表,并且有近32个不同的字段需要引用.我们还必须考虑许多这些要素需要翻译.

在阅读了几个意见后,我几乎不喜欢使用enum:

CREATE TABLE profile (
  'user_id' INT NOT NULL,
 ...
  'relationship_status' ENUM('Single','Married') NOT NULL,
 ... 
);
Run Code Online (Sandbox Code Playgroud)

通常我会使用如下参考表:

CREATE TABLE profile (
  'user_id' INT NOT NULL,
 ...
  'relationship_status_id' INT NOT NULL, 
 ... 
);

CREATE TABLE relationship_status (
  'id' INT NOT NULL,
  'name' VARCHAR(45) NOT NULL,
  PRIMARY KEY ('id') 
);
Run Code Online (Sandbox Code Playgroud)

但是创建32个表可能会被过度杀死所以我正在考虑用PHP编写代码:

class RelationshipStatusLookUp{
  const SINGLE = 1;
  const MARRIED = 2;

  public static function getLabel($status){
      if($status == self::SINGLE)
         return 'Single';
      if($status == self::MARRIED)
         return 'Married';
      return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

你怎么看?因为我猜它可以提高查询的性能,也可以使整个站点的开发更容易.

谢谢.

liq*_*car 10

绝对是一个好主意,避开ENUM恕我直言:为什么ENUM是邪恶的.从技术上讲,查找表将是首选解决方案,尽管对于简单的值,PHP类可以工作.出于与ENUM相同的原因,您需要小心这一点; 如果您的集合中的值增长,则可能难以维护.(如何"共同居住","离婚","民事伴侣","丧偶"等).使用PHP类查询值列表也不是一件容易的事.它可以使用反射,但不像简单的MySQL SELECT那么简单.这可能是我不担心性能直到它成为问题的情况之一.首先为您的代码/应用程序使用最佳解决方案,然后根据需要进行优化.


Mar*_*ker 5

枚举字段存在一些问题:

  • 一旦设置好,它们就不容易改变

    'relationship_status' ENUM('Single','Married') NOT NULL,
    
    Run Code Online (Sandbox Code Playgroud)

    现在需要在这个国家加入"民事伙伴关系"

  • 您无法从枚举列表中轻松创建选项的下拉列表

但是,数据库上的数据可能会受到参照完整性约束,因此使用针对引用表的外键链接可以在不受枚举约束的情况下进行验证.

维护类中的选项需要对必须添加到数据的任何新选项进行代码更改,这可能会增加所涉及的工作,具体取决于您的发布过程,并且不会阻止将错误数据插入到数据库中.

就个人而言,我会去参考表