-1

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

1) 每次需要时添加新列,这会将 Null 条目放置到新添加列的先前行中。

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

表 1:用户 ID | 名字 | 年龄 | ……

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

表 3:用户 ID | 列 ID | 价值

哪种方法适合我的方案?

4

1 回答 1

4

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

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

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

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

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

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

于 2015-06-15T11:08:44.413 回答