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

Posted

技术标签:

【中文标题】数据库设计:如何存储列属性?【英文标题】: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 感兴趣。

【问题讨论】:

【参考方案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 和默认值

以上是关于数据库设计:如何存储列属性?的主要内容,如果未能解决你的问题,请参考以下文章

以下哪个设计符合表设计规范

09MySQL—列属性

数据模型设计

HBaseRowkey设计

如何在设计数据库模型中添加实体框架地理位置属性

如何在数据库设计中对属性单元进行建模?