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

标签 mysql sql vertical-partitioning

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

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

2) 添加一个新表,其中将包含所有列 id 到列名,以及另一个表,其中包含键值之类的结构,用于每个具有该特定新列条目的用户,如下所示:

表 1: 用户名 |名字 |年龄 | ....

表 2: 列号 |列名 |数据类型

表 3: 用户名 |列号 |值

哪种方法适合我的场景?

最佳答案

这似乎是一个非常有效的问题,只是没有正确答案。

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

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

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

  • 有多少个人资料?
  • 添加新列时是否考虑了性能?
  • 新列是否需要索引?
  • 新列的类型是否始终相同?
  • 新列是否需要外键引用?
  • 是否需要或需要其他约束条件?
  • 是否所有配置文件都包含所有列?
  • 配置文件列数是否会超过表格的最大列数?

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

关于mysql - 定期向 sql 表中添加列的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30843398/

相关文章:

PHP session 数组值

mysql - Apache spark如何计算分区以及分区在executor中是如何处理的

mysql - 在MySQL中,TEXT或BLOB的指定大小是否会影响性能或表大小?

sql - 左外连接查询

performance - postgresql:垂直分区没有带来性能提升

sql-server-2000 - SQL 服务器 : Any value in vertical partitioning when i'm always going to re-JOIN them?

mysql - add_rosteritem 不能在 ejabberd 服务器中使用 xml_rpc

sql - SQL中如何计算两个日期之间 "Tuesdays"的个数?

mysql - 在 SQL 中查找每年租用最多的汽车

sql - 外键引用多个表