【问题标题】:Database Design: How to store column properties?数据库设计:如何存储列属性?
【发布时间】:2017-11-17 10:33:15
【问题描述】:

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

【问题讨论】:

    标签: sql postgresql database-design


    【解决方案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 列中。

    【讨论】:

    • 这确实解决了我遇到的问题....但我不禁认为这会使数据的使用变得痛苦,因为如果我想这样做一个简单的 SELECT 用于所有表单值,我必须对每列进行自连接,对吗?
    • @user3243135:是的,这是这种通用数据模型的缺点之一。将其存储在单个 JSON 列中将使 that 部分更容易
    【解决方案2】:

    为什么不将您需要的列定义为NOT NULL

    create table form1 (
        field1 text not null, 
        field2 text,
        -- ...
        fieldn text not null
    );
    

    声明 not null 的那些是必需的。

    【讨论】:

    • 我希望能够存储不完整的表格,正如我在问题中所说的那样。
    • 因此使用 Gordon 的想法将不完整的表单数据存储在单独的表中,当第一次插入失败时,但使用 dB 字典中的元数据来定义 this vis the not null 约束。甚至可以在此处保留 cmets 和默认值
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多