Mysql 处理具有增长和收缩可能性的自定义用户字段

Mysql 处理具有增长和收缩可能性的自定义用户字段,mysql,database,database-design,Mysql,Database,Database Design,这个问题主要是关于如何做、想法等 我有一种情况,用户可以创建尽可能多的自定义字段,包括数字、文本或日期,并使用这些字段创建表单。我必须制作/设计一些能够处理和存储值的表模型,以便保存后可以对这些值进行查询 之前我硬编码了25个用户定义字段(UDF)的格式。我创建了一个25列的表,其中包含10个数字、10个文本和5个日期类型,如果用户使用任何字段,则将标签存储在其中。然后将其映射到具有相同格式的其他表并存储该值。映射是为了知道哪个字段有什么标签,但我希望这不是一种有效的方法 如有任何建议,将不胜感

这个问题主要是关于如何做、想法等

我有一种情况,用户可以创建尽可能多的自定义字段,包括数字、文本或日期,并使用这些字段创建表单。我必须制作/设计一些能够处理和存储值的表模型,以便保存后可以对这些值进行查询

之前我硬编码了25个用户定义字段(UDF)的格式。我创建了一个25列的表,其中包含10个数字、10个文本和5个日期类型,如果用户使用任何字段,则将标签存储在其中。然后将其映射到具有相同格式的其他表并存储该值。映射是为了知道哪个字段有什么标签,但我希望这不是一种有效的方法

如有任何建议,将不胜感激

用户有权创建上述类型的任意数量的自定义项。然后可以使用它再次生成表单这也是N个数字,并且必须保存每个表单类型的数据

e、 例如,一个用户创建了10个数字10日期和10个文本字段,每个字段的前5个用于生成form1,所有10个用于生成form2,现在保存了数据

我的想法是:

用[id、名称(作为UDF_xxx,其中xxx是数据类型)、用户标签]制作一个表1

表2映射表单和表1[id(f_键表1_id),f_id(表单id)]

并将每个数据类型的1个表设置为[id(表1的f_键)、f_id(表格编号)、R_id(数据的行id,对于所有数据类型都相同)、值]


多亏了我将要实现的一切,DataSet条目和json方法看起来都不错,因为它提供了更广泛的扩展能力。不过,我还是要找出哪种格式最适合现有格式

创建一个表来管理存在哪些字段。然后为您想要支持的每种数据类型创建表,用户将在其中输入它们的值

create table Fields(
  fieldid int not null,
  fieldname text not null,
  fieldtype int not null
);

create table FieldDate
(
   ValueId int not null,
   fieldid int not null,
   value date
);

create table FieldNumber
(
   ValueId int not null,
   fieldid int not null,
   value number
);

..

另一种可能是使用
altertable
创建自定义字段。如果您的应用程序有权执行此命令,并且自定义字段很少更改,则这将是我选择的选项。

创建一个表来管理存在哪些字段。然后为您想要支持的每种数据类型创建表,用户将在其中输入它们的值

create table Fields(
  fieldid int not null,
  fieldname text not null,
  fieldtype int not null
);

create table FieldDate
(
   ValueId int not null,
   fieldid int not null,
   value date
);

create table FieldNumber
(
   ValueId int not null,
   fieldid int not null,
   value number
);

..

另一种可能是使用
altertable
创建自定义字段。如果您的应用程序有权执行此命令,并且自定义字段很少更改,那么这将是我选择的选项。

您希望实现什么? 每个表单排列的表,或者每个数据集可能由不同的集合组成

我突然想到两种可能性:

  • 创建一个表来描述数据集的一个字段,即键可以是数据集id+字段id,其他列可以包含存储为字符串的值以及该值的类型(即数字、字符串、布尔值等)。

    这样,每个数据集可能不同,但在读取数据集并将其存储到对象中时,可以创建适当的值类型(整数、双精度、字符串、布尔值等)

  • 使用一些naimg约定,为每个表单创建一个表。更改表单布局时,执行ALTERTABLE语句以添加、删除、重命名列或更改其类型。 当用户更改或删除列的类型时,您可能需要拒绝这些值是否为null,或者至少询问用户是否愿意删除不符合新要求的值


  • 编辑:方法1的示例

    表UDF//描述了可用字段
    -----------
    id(主键)
    用户id(FK)
    类型
    名称

    表格表单//描述表单的常规属性
    -----------
    id(主键)
    用户id(FK)
    名称
    说明

    表格表单\布局//描述表单的字段布局
    -----------
    表格id(FK)
    自定义项id(FK)
    映射//映射信息,如列索引、表单字段名等

    表DATASET_ENTRY//描述了数据集的一个条目,即数据集中一个自定义项的值
    --------
    id(主键)
    行id
    表格id(FK)
    自定义项id(FK)



    然后,为特定表单选择内容可能如下所示:
    从数据集中选择e.value、f.type、l.mapping\u条目e

    在e.UDF\u id=f.id上加入自定义项
    
    在e.FORM\u id=l.FORM\u id和e.udf\u id=l.udf\u id上加入表单布局l


    其中e.row\u id=?和e.form_id=?

    您想要实现什么? 每个表单排列的表,或者每个数据集可能由不同的集合组成

    我突然想到两种可能性:

  • 创建一个表来描述数据集的一个字段,即键可以是数据集id+字段id,其他列可以包含存储为字符串的值以及该值的类型(即数字、字符串、布尔值等)。

    这样,每个数据集可能不同,但在读取数据集并将其存储到对象中时,可以创建适当的值类型(整数、双精度、字符串、布尔值等)

  • 使用一些naimg约定,为每个表单创建一个表。更改表单布局时,执行ALTERTABLE语句以添加、删除、重命名列或更改其类型。 当用户更改或删除列的类型时,您可能需要拒绝这些值是否为null,或者至少询问用户是否愿意删除不符合新要求的值


  • 编辑:方法1的示例

    表UDF//描述了可用字段
    -----------
    id(主键)
    用户id(FK)
    类型
    名称

    表格表单//描述表单的常规属性
    -----------
    id(主键)
    用户id(FK)
    名称
    说明

    表格表单\布局//描述表单的字段布局
    -----------
    表格id(FK)
    自定义项id(FK)
    映射//映射信息,如列索引、表单字段名等

    表DATASET_ENTRY//描述了数据集的一个条目,即数据集中一个自定义项的值
    -
    users
      user_id
    
    attributes
      attr_id
      user_id (FK)
      attr_type
      attr_name
    
    attribute_values
      attr_val_id
      attr_id (FK)
      attr_val