定期向sql表添加列的好方法

时间:2015-06-15 10:55:43

标签: mysql sql vertical-partitioning

我正在使用mysql,我有一个用户表,其中包含一些基本信息,如姓名,姓氏,年龄,性别等。我想提供一个名为profile的功能,用户将在其中放置其他信息,如工作地点,替代联系人细节等等。这些新列不固定,以后可以有更多列。据我所知,可以有两种方法:

1)每次需要时添加新列,这会将Null条目放入新添加列的前一行。

2)添加一个新表,其中包含列名的所有列ID,另外还有一个表,其中包含具有该特定新列条目的每个用户的键值结构,如下所示:

表1: userId | firstName |年龄| ....

表2: columnId | columnName |的dataType

表3: userId | columnId |值

哪种方法适合我的情景?

1 个答案:

答案 0 :(得分:4)

我很想投票结束这个问题,因为某些过于宽泛和基于意见的组合。然而,这似乎是一个非常有效的问题,只是一个没有正确答案的问题。

您的列表中至少还有两种方法:

  • 将其他字段存储在每条记录中的JSON或XML字符串中。
  • 使用相同的主键在辅助表中添加列。

为了确定哪种方法最好,您需要更多地了解您的问题。例如:

  • 有多少个档案?
  • 添加新列时是否存在性能问题?
  • 新列上是否需要索引?
  • 新列的类型是否始终相同?
  • 新列是否需要外键引用?
  • 是否需要或需要其他约束?
  • 是否所有配置文件都包含所有列?
  • 配置文件列的数量是否会超过表的最大列数?

这个问题没有一个正确的答案。 EAV(实体 - 属性 - 值数据模型)方法(您的第二种方法)通常会使所有列具有相同类型并排除外键约束(围绕这两个问题存在一些麻烦的方法)。另一方面,如果配置文件列的数量超过了数据库的最大值,那么您可能别无选择,只能使用某种形式的EAV。