"成就"的最佳MySQL数据类型柱

时间:2017-08-03 07:42:02

标签: php mysql

之前提出的类似问题(即here),我得出结论:

  • 无需分离"成就"来自"用户"的数据表是一个单独的表,除非你是FB。这有助于避免不必要的JOIN。
  • 我们可以想到"成就"数据作为数字序列(见下文),因此不需要制作多个列(在"用户和#34;表中)。

遵循这个逻辑,我得到了varchar(24)"成就"列"用户"表。格式:

1,4,50,300,50

USER类知道1代表:"写了1个帖子" 4代表" 4个问题回答"等等。为了获得成就数据我使用:

SELECT column's respective row BY userID 

+

explode (',', $array);

我在考虑varchar(24)是否是这个目的的最佳选择(比如说,总共有5个成就,每个最多4个数字+逗号后面,最大长度为varchar24)。

据我所知,即使我把varchar(200)放好 - 我的表与互联网巨头相比相对较小。

但追求完美的愿望不会让我成为人,我正在寻找你的建议和专业知识! =)

1 个答案:

答案 0 :(得分:3)

我认为解决这个问题不是“最佳做法”。成就和用户与 n:m 关系相关联。 见:https://en.wikipedia.org/wiki/Third_normal_form

这需要您创建一个关系表,该关系表具有用户的外键和用于实现的外键。此表用于创建这些表之间的连接。 那将是最好的做法。

按照您的方式,您将始终受限于您拥有的列数。此外,在创建新列时,数据库将变慢以供实际使用。您可以尝试将其另存为CLOB(字符大对象),并记下成就的技术键列表,这些键由行分隔。但正如我提到的那样,复杂的实际任务。

MySQL的本机sql中的select语句可能如下所示:

SELECT USER.*, ACHIEVEMENT.* FROM USER_ACHIEVEMENT 
INNER JOIN USER ON USER.ID = USER_ACHIEVEMENT.USER_ID 
INNER JOIN ACHIEVEMENT ON ACHIEVEMENT.ID = USER_ACHIEVEMENT.ACHIEVEMENT_ID
  

USER_ACHIEVEMENT:是连接USER和ACHIEVEMENT的表。

注意:不建议在sql选择中使用*