我有一个Web应用程序,其中包含许多具有多个字段的表单。其中一些字段是必需的,有些则不是,但我希望能够将表单值保存在数据库表中,以便用户可以保存其进度。如何存储有关列的元信息?具体来说,我说有一张桌子:
create table form1 (
field1 text,
field2 text,
-- ...
fieldn text
)
我想存储关于哪些字段在某处需要的业务逻辑,以便我可以查询数据库以获得类似的内容:
('field1_val', true, null, false, ..., 'fieldn_val', true)
其中每个奇数列都是表中存储的值,偶数列是字段是否是必需的。我想有一个单独的表存储需求数据:
create table form1_requirements (
table_name text,
field_name text,
required boolean
);
insert into form1_requirements values ('foo', 'field1', true);
insert into form1_requirements values ('foo', 'field2', false);
insert into form1_requirements values ('foo', 'fieldn', true);
但是,我不确定是否可以像这样进行连接,如果这是可取的。
最佳解决方案是什么?我主要对postgresql感兴趣,还有mysql和sqlite3。
答案 0 :(得分:1)
我会不存储这样的字段。这些字段应位于一个单独的表中,该表与表单表具有一对多的关系:
create table form
(
id integer primary key,
name text not null unique,
... other columns for the form ...
);
create table field
(
id integer primary key,
form_id integer not null reference form
name text not null,
required boolean,
... other columns describing a single field, e.g. the data type ...
);
个别值应存储在单独的表中:
create table form_values
(
form_id integer not null references form,
field_id integer not null references field,
value text,
primary key (form_id, field_id)
);
以上也被称为"实体 - 属性 - 值"设计模式。
另一种选择是将该信息存储在json
列中:
create table form
(
id integer primary key,
name text not null unique,
field_definitions jsonb
);
在field_definitions列中,您可以存储以下内容:
{
"field_1": {"name": "Lastname", "required": true }},
"field_2": {"name": "Firstname", "required": false }}
}
您仍应使用第二个表来存储实际字段值。您还可以将单个表单的所有值存储在一个JSON列中。
答案 1 :(得分:0)
为什么不定义所需的列NOT NULL
?
create table form1 (
field1 text not null,
field2 text,
-- ...
fieldn text not null
);
然后需要声明not null
的那些。