2012-06-27 3 views
1

우리는 postgresql 데이터베이스에 작은 데이터웨어 하우스가 있고 모든 테이블을 문서화해야합니다.데이터웨어 하우스 (postgressql) 문서에 접근하는 방법은 무엇입니까?

모든 열과 테이블에 주석을 추가하고 파이프 "|"를 사용할 수 있다고 생각했습니다. separator를 사용하여 더 많은 속성을 추가하십시오. 그런 다음 정보 스키마 및 배열 함수를 사용하여 설명서를 얻고보고 소프트웨어를 사용하여 원하는 출력을 만들 수 있습니다.

select 
    ordinal_position, 
    column_name, 
    data_type, 
    character_maximum_length, 
    numeric_precision, 
    numeric_scale, 
    is_nullable, 
    column_default, 
    (string_to_array(descr.description,'|'))[1] as cs_name, 
    (string_to_array(descr.description,'|'))[2] as cs_description, 
    (string_to_array(descr.description,'|'))[3] as en_name, 
    (string_to_array(descr.description,'|'))[4] as en_description, 
    (string_to_array(descr.description,'|'))[5] as other 
from 
    information_schema.columns columns 
    join pg_catalog.pg_class klass on (columns.table_name = klass.relname and klass.relkind = 'r') 
    left join pg_catalog.pg_description descr on (descr.objoid = klass.oid and descr.objsubid = columns.ordinal_position) 
where 
    columns.table_schema = 'data_warehouse' 
order by 
    columns.ordinal_position; 

더 좋은 방법인가요?

+0

Welcome to StackOverflow! –

답변

3

시스템 테이블에 대한 설명을 포함해야하는 경우가 아니라면 설명을 pg_catalog.pg_description에 넣지 않으려 고합니다. 나만의 식탁을 만들어라. 그렇게하면 열을 열로 유지하고 clunky 문자열 함수를 사용할 필요가 없습니다.

또는 특수 형식의 주석을 javadoc 행을 따라 마스터 스키마 파일에 추가하는 것을 고려하십시오. 그런 다음 주석을 추출하고 문서를 작성하는 도구를 작성하십시오. 그렇게하면 주석이 주석에 가깝게 머무르게되며 보고서를 생성하기 위해 데이터베이스를 전혀 망칠 필요가 없습니다.

table users: Used for authentication 
    id: standard Rails-friendly primary key. Also an example of a 
     long comment placed before the item, rather than on the same 
     line. 
    name: Real name 
    login: Name used for authentication 

당신은 수도 :

--* Used for authentication. 
create table users 
(
    --* standard Rails-friendly primary key. Also an example of 
    --* a long comment placed before the item, rather than on the 
    --* the same line. 
    id serial primary key, 
    name text not null,  --* Real name (hopefully) 
    login text not null, --* Name used for authentication 
    ... 
); 

귀하의 문서 도구는 예를 들어, 파일을 읽는 --* 의견을 보이는, 어떤 것들로 이동 코멘트 무엇인지 파악하고, 보고서의 어떤 종류를 생산 : 예를 들어, 적절한 주석을 사용하면 마스터 스키마 파일 자체가 매우 훌륭한 보고서이며, 아마도 그 밖의 것은 필요하지 않을 수 있습니다.

+0

대답 해 주셔서 감사합니다. 나는 테이블과 속성을 문서화하기위한 별도의 테이블을 생성 할 것이다. –

1

관심이있는 사람은 내 작은 문서 프로젝트의 초기로드에 사용한 내용입니다. 문서는 테이블을 설명하는 테이블과 열과 제약 조건을 설명하는 테이블 중 하나입니다. 나는 어떤 의견을 주셔서 감사합니다.

/* -- Initial Load - Tables */ 

drop table dw_description_table cascade; 

create table dw_description_table (
    table_description_key serial primary key, 
    physical_full_name character varying, 
    physical_schema_name character varying, 
    physical_table_name character varying, 
    Table_Type character varying, -- Fact Dimension ETL Transformation 
    Logical_Name_CS character varying, 
    Description_CS character varying, 
    Logical_Name_EN character varying, 
    Description_EN character varying, 
    ToDo character varying, 
    Table_Load_Type character varying, --Manually TruncateLoad AddNewRows 
    Known_Exclusions character varying, 
    Table_Clover_Script character varying 
); 



insert into dw_description_table (physical_full_name, physical_schema_name, physical_table_name) (

select 
    table_schema || '.' || table_name as physical_full_name, 
    table_schema, 
    table_name 
from 
    information_schema.tables 
where 
    table_name like 'dw%' or table_name like 'etl%' 
) 


/* -- Initial Load - Columns */ 


CREATE TABLE dw_description_column (
    column_description_key serial, 
    table_description_key bigint, 
    physical_full_name text, 
    physical_schema_name character varying, 
    physical_table_name character varying, 
    physical_column_name character varying, 
    ordinal_position character varying, 
    column_default character varying, 
    is_nullable character varying, 
    data_type character varying, 
    logical_name_cs character varying, 
    description_cs character varying, 
    logical_name_en character varying, 
    description_en character varying, 
    derived_rule character varying, 
    todo character varying, 
    pk_name character varying, 
    fk_name character varying, 
    foreign_table_name character varying, 
    foreign_column_name character varying, 
    is_primary_key boolean, 
    is_foreign_key boolean, 
    CONSTRAINT dw_description_column_pkey PRIMARY KEY (column_description_key), 
    CONSTRAINT fk_dw_description_table_key FOREIGN KEY (table_description_key) 
     REFERENCES dw_description_table (table_description_key) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
); 




insert into dw_description_column ( 
    table_description_key , 
    physical_full_name , 
    physical_schema_name , 
    physical_table_name , 
    physical_column_name , 
    ordinal_position , 
    column_default , 
    is_nullable , 
    data_type , 
    logical_name_cs , 
    description_cs , 
    logical_name_en , 
    description_en , 
    derived_rule , 
    todo , 
    pk_name , 
    fk_name , 
    foreign_table_name , 
    foreign_column_name , 
    is_primary_key , 
    is_foreign_key) 

(

with 

dw_constraints as (
SELECT 
    tc.constraint_name, 
    tc.constraint_schema || '.' || tc.table_name || '.' || kcu.column_name as physical_full_name, 
    tc.constraint_schema, 
    tc.table_name, 
    kcu.column_name, 
    ccu.table_name AS foreign_table_name, 
    ccu.column_name AS foreign_column_name, 
    TC.constraint_type 
FROM 
    information_schema.table_constraints AS tc 
    JOIN information_schema.key_column_usage AS kcu ON (tc.constraint_name = kcu.constraint_name and tc.table_name = kcu.table_name) 
    JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name 
WHERE 
    constraint_type in ('PRIMARY KEY','FOREIGN KEY') 
    AND tc.constraint_schema = 'bizdata' 
    and (tc.table_name like 'dw%' or tc.table_name like 'etl%') 
group by 
    tc.constraint_name, 
    tc.constraint_schema, 
    tc.table_name, 
    kcu.column_name, 
    ccu.table_name , 
    ccu.column_name, 
    TC.constraint_type 

) 

select 
    dwdt.table_description_key, 
    col.table_schema || '.' || col.table_name || '.' || col.column_name as physical_full_name, 
    col.table_schema as physical_schema_name, 
    col.table_name as physical_table_name, 
    col.column_name as physical_column_name, 
    col.ordinal_position, 
    col.column_default, 
    col.is_nullable, 
    col.data_type, 
    null as Logical_Name_CS , 
    null as Description_CS , 
    null as Logical_Name_EN, 
    null as Description_EN , 
    null as Derived_Rule , 
    null as ToDo, 
    dwc1.constraint_name pk_name, 
    dwc2.constraint_name as fk_name, 
    dwc2.foreign_table_name, 
    dwc2.foreign_column_name, 
    case when dwc1.constraint_name is not null then true else false end as is_primary_key, 
    case when dwc2.constraint_name is not null then true else false end as foreign_key 
from 
    information_schema.columns col 
    join dw_description_table dwdt on (col.table_schema || '.' || col.table_name = dwdt.physical_full_name) 
    left join dw_constraints dwc1 on ((col.table_schema || '.' || col.table_name || '.' || col.column_name) = dwc1.physical_full_name and dwc1.constraint_type = 'PRIMARY KEY') 
    left join dw_constraints dwc2 on ((col.table_schema || '.' || col.table_name || '.' || col.column_name) = dwc2.physical_full_name and dwc2.constraint_type = 'FOREIGN KEY') 
where 
    col.table_name like 'dw%' or col.table_name like 'etl%' 
) 
관련 문제