虽然我正在为约会网站设计一个 MySQL数据库,但我对如何存储引用数据表示怀疑。目前,该数据库有33个表,并且有近32个不同的字段需要引用。我们还必须考虑许多这些要素需要翻译。
在阅读了几个意见后,我几乎被解雇使用enum ,如:
CREATE TABLE profile (
'user_id' INT NOT NULL,
...
'relationship_status' ENUM('Single','Married') NOT NULL,
...
);
通常我会使用参考表,如:
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')
);
但是创建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;
}
}
你怎么看?因为我猜它可以提高查询的性能,也可以使整个网站的开发更容易。
感谢。
答案 0 :(得分:10)
绝对是一个好主意,避开ENUM恕我直言:why ENUM is evil。从技术上讲,查找表将是首选解决方案,尽管对于简单的值,PHP类可以工作。出于与ENUM相同的原因,您需要小心这一点;如果您的集合中的值增长,则可能难以维护。 (如何“共同居住”,“离婚”,“民事伴侣”,“丧偶”等)。使用PHP类查询值列表也不是一件容易的事。它可以使用反射,但不像简单的MySQL SELECT那么简单。这可能是我不担心性能直到它成为问题的情况之一。首先为您的代码/应用程序使用最佳解决方案,然后根据需要进行优化。
答案 1 :(得分:5)
枚举字段存在一些问题:
一旦设定,就无法轻易改变
'relationship_status' ENUM('Single','Married') NOT NULL,
您无法从枚举列表中轻松创建选项下拉列表
但是,数据库上的数据可能会受到参照完整性约束,因此使用针对参考表的外键链接可以在没有枚举约束的情况下进行验证。
维护类中的选项需要对必须添加到数据的任何新选项进行代码更改,这可能会增加所涉及的工作,具体取决于您的发布过程,并且不会阻止将错误数据插入到数据库中
就个人而言,我会去参考表
答案 2 :(得分:1)
首先,id
表格中不需要relationship_status_id
和Relationship_status
。
就个人而言,我会使用枚举,除非您需要关联更多数据而不仅仅是关系人员姓名(或者如果您预计将来需要对此进行扩展)。当你查看数据库时,如果它是一种易于阅读的语言而不是必须查询第二个表,那将会更容易。
当您考虑性能时,确定通过唯一ID查询表更快,但您必须跟踪该关系,并且您将始终连接多个表以获取相同的数据。如果枚举解决方案最终变慢,我认为即使使用大型数据集,人脑也能够感知差异是不够的。