为自定义字段动态地向表中添加新列

时间:2012-05-23 04:23:06

标签: mysql

我正在为我的应用程序构建自定义字段功能。这允许管理员根据站点的需要为用户添加自定义配置文件字段。

架构很简单

field_meta (store some metadata about the field)
================================================
id
type //type of field
field_name //name of the field in the fields table
render_data //Some data to use when rendering the form field

field
===================
id
name //Default field that can't be deleted
address //Default field that can't be deleted
customfield_1
customfield_2

field_meta表用于存储字段的一些元数据,以便我们可以呈现表单字段。

然后将每个字段存储在field表中的新列中。

问题: 为了实用性而不必处理用户选择保留字或使用非英文单词作为列名,我不会要求用户选择列名的名称。

我目前正在考虑按字段类型调用列名称(应用程序中有很多类型(电子邮件,网站,文本,段落文本等),仅举几例)并添加一个数字。一些例子:

  • EMAIL_1
  • 文本_1
  • _2
  • Text_3
  • EMAIL_2

然而,这种方法的问题在于提出列名需要花费大量的工作。我需要获取所有列,选择与我创建的列类型相同的列,解析最大的数字,然后创建列。

有更好的策略吗?或者用一种完全不同的方式来命名消除这些问题的列?

2 个答案:

答案 0 :(得分:0)

不要尝试动态添加列,这是一种缓慢(而不是好的形式)方法。

相反,将额外的列存储在新表中,每个表都有自己的ID。然后有另一个表存储用户ID,额外列ID和该用户的属性信息。这将模仿添加新列而无需实际执行此操作。

编辑: 确实,它确实听起来像EAV。架构:
    属性{id:int,name:string}
    用户{id:int,name:string,(任何其他需要的......)}
    Users_attributes {Attribute_id:int,User_id:int,Attribute_info:string}

然后只需将任何新属性输入到Attributes(带有递增ID),并将任何新用户信息输入到具有相应User_id和Attribute_id的User_attributes中。

答案 1 :(得分:0)

我决定采用我原来的方法,即基本上创建一个由类型和递增数字组成的列名:

  • Email_1
  • 文本_1
  • _2
  • Text_3

虽然生成名称需要花费相当多的精力,但只有在创建配置文件字段时才会这样做,因此性能损失只会在此期间发生。