我想构建一个系统,管理员可以使用该程序创建表单,用户可以向这些表单输入数据。此外,管理员应该能够在其表单中输入任何字段名称,甚至是可选择的多项选择题。 我能想到的唯一答案是为每个生成的表单类型创建一个巨大的文本块,并存储表单字段,名称,选项等,从数组或对象序列化它们。 我会将用户的序列化数组中的答案保留在另一个文本块中,为每个文本块分配它们的位置。
这个问题有更好的方法吗?
答案 0 :(得分:4)
EAV data model可能适合您的目的。请注意,您将为某些缺点付出灵活性,例如缺乏参照完整性和长查询以检索数据(您要返回的每个属性都需要另一个JOIN)。
答案 1 :(得分:2)
有很多方法可以解决这个问题。由于您正在使用关系数据库,因此可以选择Entity-Attribute-Value model。实际上,这种方法将您的数据结构从预定义的模式(列)切换为行。这种灵活性有许多缺点,您最终会构建一组视图,以更传统的表格形式呈现这些“旋转”数据。
某些关系数据库提供noSQL类型的功能,因此您可以找到解决方案。例如,PostgreSQL具有hstore类型,允许您将键值对集合存储在单个值中。我意识到你没有在你的问题中提到PostgreSQL,但只是因为你知道那里有什么,他们也在为9.2生成本机JSON数据类型和函数套件。结合功能索引,这可以提供一些有趣的关系/ noSQL混合可能性,而不需要像Redis或MongoDB这样的东西。
答案 2 :(得分:0)
你能在数据库中创建一个名为“Fields”的表吗?每个字段都有一个类型和文本。然后还有一个名为options的表,它包含选项的不同文本字段以及指向“fields”表的fk。还可能有一个表格表,字段表有一个fk到。在应用程序的代码中,您可以查看一个字段并确定是否需要获取选项。这是一种关系数据库方法。像Mongo这样的一些对象数据库可以更好地处理这个问题。
总结:
表:表格 专栏:Form_ID PK
表:字段 列:Field_ID PK 专栏:文字 栏目:类型 列:Form_ID(FK)
表:选项 列:Option_ID 专栏:文字 列:Field_ID(FK)