数据库设计:如何存储列属性?

时间:2017-11-17 10:33:15

标签: sql postgresql database-design

我有一个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。

2 个答案:

答案 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的那些。