数据库设计:如何存储列属性?
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 和默认值以上是关于数据库设计:如何存储列属性?的主要内容,如果未能解决你的问题,请参考以下文章