我的项目需要支持可配置的表单格式。我的意思是用户可以向表单添加“n”个列(以设计它),然后必须将列数据保存在数据库中。稍后我还想在这些列上查询 where 子句..
但是由于列的数量和类型不固定,我如何设计我的数据库来支持这样的功能?我使用 Java 作为我的编程语言和 PostgreSQL 数据库。
我的项目需要支持可配置的表单格式。我的意思是用户可以向表单添加“n”个列(以设计它),然后必须将列数据保存在数据库中。稍后我还想在这些列上查询 where 子句..
但是由于列的数量和类型不固定,我如何设计我的数据库来支持这样的功能?我使用 Java 作为我的编程语言和 PostgreSQL 数据库。
您需要一个包含列值的单独表:
-------------------------------
| formId | columnNo | value |
-------------------------------
| 1 | 1 | first |
-------------------------------
| 1 | 2 | second |
-------------------------------
| 1 | 3 | third |
-------------------------------
列号也可以更改为列名。当然应该有另一个表格,您可以在其中保存每个表格有多少列。这是最简单的解决方案。当您需要为不同的列使用不同的数据类型时,事情会变得更加复杂。
您需要构建与名为“Randy”的人完全相同的解决方案
http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/
您也可以在谷歌上搜索“内部平台效应”,因为如果您尝试构建符合该要求的东西,那么这正是您将要做的。
您将只是在现有 DBMS 之外重新创建一个 DBMS。您将在您的应用程序代码中重新创建类型和域检查,而您现有的 DBMS 已经拥有它们,并且与 DBMS 免费提供的目的完全相同。您将重新创建表达式解析器和编译器,而您现有的 DBMS 已经拥有它们。您将重新创建数据访问策略的选择,而您现有的 DBMS 已经拥有它们。您将要重新创建的以及您现有 DBMS 已经拥有的每一件小东西,都将是您现有 DBMS 已经拥有的更差的版本。
您的用户正在寻求一种可以立即构建的软件解决方案,该解决方案可以并且将满足他将来可能遇到的所有可能需求,而无需 IT 人员的进一步干预(意思是:您的用户担任数据库设计师,虽然不具备这样做的技能,并且希望您的应用程序能够填补所有需要但用户没有的知识空白来扮演该角色)。
这听起来像是一个合理的要求吗?你真的认为构建这样的应用程序甚至是遥不可及的吗?嗯,有可能,有点。这样的应用程序确实存在。它们被称为 DB2、Oracle、Sybase、PostgreSQL ……我毫不怀疑,在您的用户可以等待的时间范围内构建与它们相匹配的东西将是遥不可及的。
这并不像听起来那么难。您只需要为表单中的列和每个实体中的值(已填写表单的一个实例)创建一个单独的表。这有时是调用和实体属性值模型。
形式
form_column
实体
实体属性
要搜索实体,您的查询屏幕可以通过在 WHERE 子句中添加“OR (entity_attribute.entity_id=entity.entity_id and entity_attribute.attribute=FOO and entity_attribute.value=BAR)”子条款来构建 SELECT 语句。
另一种方法是将表单设计和实体(填写在表单中)存储为 XML。从那里您可以使用 XMLBeans 或 DOM 解析器来处理实体。