2017-11-17 1 views
0

많은 필드가있는 양식이 많은 웹 응용 프로그램이 있습니다. 이 필드 중 일부는 필수이고 일부는 필요하지 않지만 사용자가 진행 상황을 저장할 수 있도록 데이터베이스 테이블에 양식 값을 저장할 수 있기를 원합니다. 이 열에 대한 메타 정보는 어떻게 저장합니까? 구체적으로, 나는 테이블을 가지고 말 :데이터베이스 디자인 : 열 속성을 저장하는 방법?

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

나는 같은 것을 얻을 수있는 DB를 조회 할 수 있도록 필드 어딘가에 요구되는 대한 비즈니스 로직을 저장하고 싶습니다 :

('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

필요한 열을 NOT NULL으로 정의하는 것만으로도 되십니까? not null를 선언

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

것들은 다음이 필요합니다.

+0

내가 질문에서 말했듯이 불완전한 양식을 저장할 수 있기를 원합니다. – user3243135

+0

그래서 Gordon의 아이디어를 사용하면 불완전한 양식 데이터를 첫 번째 삽입이 실패 할 때 별도의 테이블에 저장하지만 dB 사전의 메타 데이터를 사용하여이 시각을 not null 제약 조건으로 정의합니다. 여기에 코멘트와 기본값을 유지할 수도 있습니다. –

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) 
); 

위이다 필드는 형태 테이블에 일대 다 관계가있는 별도의 테이블에 있어야 "Entity-Attribute-Value"디자인 패턴으로도 알려져 있습니다.

{ 
    "field_1": {"name": "Lastname", "required": true }}, 
    "field_2": {"name": "Firstname", "required": false }} 
} 

당신은 여전히 ​​실제를 저장하기 위해 두 번째 테이블을 사용한다 : 당신이 뭔가를 저장하는 것입니다 열 field_definitions에서

create table form 
(
    id integer primary key, 
    name text not null unique, 
    field_definitions jsonb 
); 

:

또 다른 옵션은 json 컬럼에 정보를 저장하는 것입니다 필드 값. 하나의 양식에 대한 모든 값을 하나의 JSON 열에 저장할 수도 있습니다.

+0

확실히 문제가 해결됩니다 ....하지만 도움이되지는 않지만, 데이터가 엉망이 될 수 있다고 생각합니다. 모든 양식 값에 대해 간단한 SELECT를 수행하려면 열마다 자체 조인을 수행해야합니다. – user3243135

+0

@ user3243135 : 그렇습니다. 그러한 일반적인 데이터 모델의 단점 중 하나입니다. 단일 JSON 열에 저장하면 _that_ 부분을 더 쉽게 만들 수 있습니다. –

관련 문제