处理具有增长和缩小可能性的自定义用户字段
这个问题主要是关于如何做、想法等。
我遇到的情况是,用户可以创建尽可能多的数字、文本或日期类型的自定义字段,并使用它来制作表单。我必须制作/设计一些可以处理和存储该值的表模型,以便在保存后可以对这些值进行查询。
之前我已经对 25 个用户定义字段 (UDF) 的格式进行了硬编码。我制作了一个包含 25 列的表格,其中包含 10 个数字、10 个文本和 5 个日期类型,并在用户使用任何字段时将标签存储在其中。然后将其映射到具有相同格式的其他表并存储该值。进行映射是为了知道哪个字段具有什么标签,但这不是一种有效的方法,我希望。
任何建议将不胜感激。
用户有权创建任意数量的上述类型的UDF。然后它可以用来再次制作表格,这也是N个数字,并且必须保存每种表格类型的数据。
例如,假设用户创建了 10 个数字、10 个日期和 10 个文本字段,每个字段使用前 5 个字段来制作 form1,然后使用所有 10 个字段来制作 form2,现在保存了数据。
我对此的想法:
用 [id,name(as UDF_xxx where xxx is data type),UserLabel ]
table2 创建一个 table1 来映射表单和 table1 [id(f_key table1_id), F_id(form id)]
并每个创建 1 个表数据类型为 [ id(table1 的 f_key),F_id(表单编号),R_id(数据的行 id,对于所有数据类型都相同),value]
感谢我要实现的所有内容,它既是 DataSet 条目又是json 方法看起来不错,因为它提供了更广泛的扩展能力。我仍然必须弄清楚哪种最适合现有格式。
This question is much about how to do, idea etc.
I have a situation where a user can create as many custom fields as he can of type Number, Text, or Date, and use this to make a form. I have to make/design some table model which can handle and store the value so that query can be done on these values once saved.
Previously I have hard coded the format for 25 user defined fields (UDF). I make a table with 25 column with 10 Number, 10 Text, and 5 Date type and store the label in it if a user makes use of any field. Then map it to other table which has same format and store the value. Mapping is done to know which field is having what label but this is not an efficient way, I hope.
Any suggestion would be appreciated.
Users have permissions for creating any number of UDF of the above types. then it can be used to make forms again this is also N numbers and have to save the data for each form types.
e.g. let's say a user created 10 number 10 date and 10 text fields used first 5 of each to make form1 and all 10 to make form2 now saved the data.
My thoughts on it:
Make a table1 with [id,name(as UDF_xxx where xxx is data type),UserLabel ]
table2 to map form and table1 [id(f_key table1_id), F_id(form id)]
and make 1 table of each data type as [ id(f_key of table1),F_id(form number),R_id(row id for data, would be same for all data type),value]
Thanks to all I'm going to implement, it both DataSet entry and json approach looks good as it gives wider extension-ability. Still I've to figure out which will best fit with the existing format.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我使用过两种方法。
XML:要创建动态用户属性,您可以使用 XML。此 XML 将存储在 clob 列中 - 例如,
user_attributes
。将整个用户数据存储在 XML 键值对中,类型为属性或其他字段。这将为您提供最大的自由。您可以使用XOM或任何其他XML对象模型API来显示或操作数据。典型的节点看起来像
<前><代码><用户数据>;
用户出生
...
...
<数据节点>
<值>1994-02-25
...
Attribute-AttributeValue 这与上面相同,但使用表格。您要做的就是创建一个表 --
attributes
,其中 FK 作为user_id
,另一个表attribute_values
,其中 FK 作为attribute_id
>。attributes
包含每个用户
的多个字段名称和类型,attribute_values
包含以下值
那些属性。所以基本上,<前><代码>用户
用户身份
属性
属性ID
用户 ID (FK)
属性类型
属性名称
属性值
属性值ID
attr_id(外语)
属性值
如果您在两种方法中都看到,您就不会受到拥有的数据数量或数据类型的限制。但这样做有一个缺点,那就是解析。在任何一种情况下,您都必须进行少量处理才能显示或分析数据。
两全其美(具有严格的列结构与完全动态的数据)的方法是拥有一个包含必须列(如用户名、年龄、性别、地址等)的用户表,并具有用户-在 XML 或 attribute-attribute_value 中创建数据(例如最喜欢的宠物屋等)。
There are two approaches I have used.
XML: To create a dynamic user attribute, you may use XML. This XML will be stores in a clob column - say,
user_attributes
. Store the entire user-data in XML key-value pair, with type as an attribute or another field. This will give you maximum freedom.You can use XOM or any other XML object Model API to display or operate on the data. A typical Node will look like
Attribute-AttributeValue This is same thing as above but using tables. What you do is you create a table --
attributes
with FK asuser_id
, another tableattribute_values
with FK asattribute_id
.attributes
contains multiple field-names and types for eachuser
andattribute_values
containsvalues
of those attributes. so basically,If you see in both the approached you are not limited by how-many or what type of data you have. But there is a down-side of this is parsing. In either of the case, you will have to to do a small amount of processing to display or analyze the data.
The best of both worlds (having rigid column structure vs having completely dynamic data) approach is to have a
users
table with must-have columns (like user_name, age, sex, address etc) and have user-created data (like favorite pet house etc.) in either XML or attribute-attribute_value.你想实现什么目标?
每个表格排列一个表,或者每个数据集可能由不同的集合组成?
我想到了两种可能性:
创建一个表来描述数据集的一个字段,即键可能是数据集 id + 字段 id,其他列可以包含存储为字符串的值以及该值的类型(即数字、字符串、布尔值等)。
这样,每个数据集可能会有所不同,但在读取数据集并将其存储到对象中时,您可以创建适当的值类型(整数、双精度、字符串、布尔值等)
使用某些 naimg 约定为每个表单创建一个表。当表单布局更改时,执行 ALTER TABLE 语句来添加、删除、重命名列或更改其类型。
当用户更改列的类型或删除它时,如果值不为空,您可能需要拒绝,或者至少询问用户是否愿意删除不符合新要求的值。
编辑:方法 1
表 UDF 示例 //描述可用字段
--------
ID(主键)
用户 ID (FK)
类型
name
Table FORM //描述表单的一般属性
--------
ID(主键)
用户 ID (FK)
姓名
description
Table FORM_LAYOUT //描述表单的字段布局
--------
form_id (FK)
udf_id (FK)
映射 // 映射信息,如列索引、表单字段名称等
表 DATASET_ENTRY // 描述数据集的一项,即一个 UDF 的值
--------
ID(主键)
row_id
form_id (FK)
udf_id (FK)
价值
然后可以像这样选择特定表单的内容:
从 DATASET_ENTRY e 中选择 e.value、f.type、l.mapping
加入 UDF f ON e.udf_id = f.id
将 FORM_LAYOUT l 连接到 e.form_id = l.form_id 和 e.udf_id = l.udf_id
哪里 e.row_id = ? AND e.form_id = ?
What do you want to achieve?
A table per form permutation or might each dataset consist of different sets?
Two possibilities pop into my mind:
Create a table that describes one field of a dataset, i.e. the key might be dataset id + field id and additional columns could contain the value stored as a string and the type of that value (i.e. number, string, boolean, etc.).
That way each dataset might be different but upon reading a dataset and storing it into an object you could create the appropriate value types (Integer, Double, String, Boolean etc.)
Create a table per form, using some naimg convention. When the form layout is changed, execute ALTER TABLE statements to add, remove, rename columns or change their type.
When the user changes the type of a column or deletes it, you might need to either deny that if the values are not null or at least ask the user if she's willing to drop values that don't match the new requirements.
Edit: Example for approach 1
Table UDF //describes the available fields
--------
id (PK)
user_id (FK)
type
name
Table FORM //describes a form's general attributes
--------
id (PK)
user_id (FK)
name
description
Table FORM_LAYOUT //describes a form's field layout
--------
form_id (FK)
udf_id (FK)
mapping //mapping info like column index, form field name etc.
Table DATASET_ENTRY //describes one entry of a dataset, i.e. the value of one UDF in
--------
id (PK)
row_id
form_id (FK)
udf_id (FK)
value
Selecting the content for a specific form might then be done like this:
SELECT e.value, f.type, l.mapping from DATASET_ENTRY e
JOIN UDF f ON e.udf_id = f.id
JOIN FORM_LAYOUT l ON e.form_id = l.form_id AND e.udf_id = l.udf_id
WHERE e.row_id = ? AND e.form_id = ?
创建一个表来管理哪些字段存在。然后为您想要支持的每种数据类型创建表,用户将其值放入其中。
另一种可能性是使用 ALTER TABLE 来创建自定义字段。如果您的应用程序有权执行此命令并且自定义字段很少更改,这将是我选择的选项。
Create a table which manages which fields exist. Then create tables for each data type you want to support, where the user will their values into.
Another possibility would be to use
ALTER TABLE
to create custom fields. If your application has the rights to perform this command and the custom fields are changing very rarely this would be the option I chose.