2011-09-28 2 views
1

내 질문에 관한 비슷한 테이블에 대한 두 접합 테이블을 하나로 결합하는 아이디어입니다. 무슨 뜻인지 읽어보십시오. 또한 이것이 실제로 내가 직면 한 문제이며 따라서이 포럼과 관련이 있음을 주목하십시오. 그것은 당신이 원한다면 "우수 사례"에 대한보다 나은 인구 조사를 얻기 위해 다양한 전문가로부터 좀 더 많은 참여를 이끌어 내기를 희망하는 폭 넓은 결과의 주제 일뿐입니다.복잡한 데이터베이스 관계 (접합 테이블)

나는 다소 어려운 데이터베이스 디자인 문제가 있습니다. 나는 이것이 많은 사람들이 기여하고 배울 수있는 일종의 위키가되기를 바라고 있습니다. 이 작업을보다 쉽게 ​​수행하기 위해 일련의 그래픽을 만들었으며 문제를 1) 프로세스, 2) 구조로 나눕니다.

프로세스

  1. 문서 (공개)에 대한 요청 (DocRequest) 단계 이루어진다.
  2. 게시가 아직없는 경우 새 게시가 생성됩니다.
  3. 실행중인 로그 (StatusReport)는 요청 수행에 대한 진행 상황을 유지합니다.

참고 : 특정 출판을 위해 많은 DocRequests 및 (업데이트 포함) StatusReports

데이터베이스 구조가있을 수 있습니다

참고 : DocRequest 및 StatusReport 테이블 모두 다양한 분야를 가지고 첨부 그래픽에 표시되지 않은 지원 테이블. 또한 특정 게시는 해당 테이블의 모든 레코드가 속한 마스터 레코드입니다.

--Current Implementation-- enter image description here

참고 :이 디자인의 주요 결함은 새 DocRequest 및 StatusReport 기록을 만들 때마다, 당신은 또한 출판물에 새로운 레코드를 작성해야한다는 것입니다 테이블 (junction 테이블과 같은 역할을 함)을 사용하지만 결과적으로 새로운 공개를 작성합니다. 이것은 바람직한 행동이 아닙니다.

--Typical Implementation-- (이러한 유형의 관계에 대한) enter image description here

참고 :이 좋아, 아마도 이상적이지만, 독립적으로 연결의 DocRequest 및 StatusReport 테이블 하나에 업데이트를 처리 그들이 속한 출판물에. (이 특별한 경우에 대한) 아니야 자,가요 선호 Implementation--

enter image description here

참고 : 여기 있었다 아이디어는, 하나에 이중 접합 테이블을 결합하는 간단했다. 이 경우 접합 테이블은 DocRequest 또는 StatusReport가 삽입이 발생할 때마다 새 레코드를 가져옵니다. 나는 이것을 방아쇠로 처리 할 것입니다.

토론 지금

토론. 나는 이것이 나쁜 생각이고 이것이 어떤 문제가 발생할 수 있다고 생각한다면 동료 데이터베이스 개발자로부터 알고 싶습니다. 나는 레코드의 순수한 숫자가 두 개의 분리 된 접합 테이블과 동일해야하며 사실 여분의 ID 컬럼을 저장함으로써 약간 더 적은 공간을 사용한다고 생각한다. :)

너희들이 생각하는 것을 나에게 알려줘. 나는이 토론에 많은 사람들이 참여하도록하고 싶다. 건배! :)

+0

하나의 문서 요청으로 여러 문서가 생성 될 수 있습니까? 하나의 문서가 여러 요청의 결과 일 수 있습니까? 하나의 상태 보고서가 여러 문서와 관련이 있고, 여러 문서가 하나의 상태 보고서와 관련이 있습니까, 둘 중 하나 또는 둘 다가 관련되지 않습니까? 문서 요청과 상태 보고서 사이에 관계가 있습니까? 여러분이 제시하는 세 가지 디자인은이 점들에서 서로 다르기 때문에 명시 적으로 만들어야합니다. –

+0

비즈니스의 관점에서 게시를 정의하는 속성은 무엇입니까? 즉, 게시가 문서 요청 또는 상태 보고서의 결과 일 수 있으며 또는 둘 다 아니거나 아니므로 유형 하위 유형 구조를 만들려고합니까? "StatusReport"는 보고서의 상태를 의미합니까, 아니면 보고서 유형입니까? – Thomas

+0

"상태 보고서"는 문서 요청의 상태, 문서 요청을 수행 할 게시 상태 또는 두 가지 모두와 관련이 있습니까? –

답변

2

나는 당신이 접합점의 관점에서 생각함으로써 자신을 상처주고 있다고 생각합니다. 테이블을 생각해보십시오. StatusReport 이후

  • 는 어떻게 든 에 관한 테이블이 필요 , 문서 요청의 상태와 관련이있다.
  • "StatusReport"는 문서 요청 상태에 대한 사실을 저장하는 테이블에 대한 지독한 이름입니다.
  • "ID"는 테이블의 모든 열에 대한 지독한 이름입니다.
  • 발행물의 ID 번호는 요청의 상태보다 문서 요청과 관련이있는 것으로 보입니다. (당신이 말하기를, "새로운 출판물은 출판물이 이미 존재하지 않는다면 만들어집니다."솔직히 말하면, 그것은 이해가 안가는 것의 거의 끝까지 스케이팅하고 있습니다.) 따라서 발행 번호는 DocRequest 테이블에 거의 확실하게 포함되어 있습니다.

선호하는 구현 다이어그램을 참조하여 TripleJunction 테이블을 삭제하고 StatusReport를이 테이블로 바꿉니다.

-- Predicate: Document request number (doc_request_id) has status (status) 
--   as of date and time (status_as_of). 
create table document_request_status (
    doc_request_id integer not null references DocRequest (id), 
    status_as_of timestamp not null default current_timestamp, 
    status varchar(10) not null, 
    -- other columns go here 
    primary key (doc_request_id, status_as_of) 
); 
+0

예, 그것에 대해 말해보십시오. 나는 몇 달 동안이 디자인에 대한 요구 사항을 머리에 새겨 넣으려고 노력해 왔습니다. 이것이 내가 생각할 수있는 최선입니다.더 간단하게 말하자면, 우리는 제품을 가지고 있습니다. 해당 제품에는 다양한 출판물이 필요합니다. 그 간행물은 먼저 웹 양식을 통해 요청 된 다음 작성됩니다. 일단 생성되면 개발 과정을 추적합니다. 트릭은 원본 요청 (변경 사항은 SQL 업데이트가 아니라 삽입, 따라서 다 대다) 및 상태 보고서 및 업데이트 (실제로 삽입)에 대한 실행 로그 (기록)가 필요하다는 것입니다. 더 명확 해? 오이. – Chiramisu

+0

사실 나는 틀 렸습니다. 다시 생각해 보면 StatusReport가 특정 발행물의 진행 상태를 참조하고 있음을 확신합니다. Publications와 StatusReports의 시작점은 Request입니다. 또한 StatusReports 및 요청에는 실제 웹 양식의 데이터가 포함됩니다. 테이블 이름은 모델링 한 실제 오브젝트를 반영합니다. 우리는 본질적으로 이전의 종이 프로세스를 데이터베이스가있는 디지털 프로세스로 이동시키고 있습니다. "ID"에 관해서는 필자가 개인적으로 선호하는 것은 내 조인이'on ProductID = Products.ID'처럼 보이기 때문입니다. – Chiramisu

+0

이거 !! 나는 옛날 교수님과 만날 기회가 있었고 Catcall이했던 것처럼, 나는 관계가 잘못되었다고 생각했다. 제가 여기있는 것은 실제로 진정한 다 - 대 - 다 관계가 아닙니다. 실제로는 DocRequest 항목의 그룹에 속하는 StatusReport 항목의 그룹입니다. 해결책은 Publications 테이블을 삭제하고 "FirstRequest"필드를 DocRequest 테이블에 추가하고 하나는 StatusReport 테이블에 추가하는 것이 었습니다. 둘 다 DocRequest의 기본 키에 대한 외래 키 역할을했습니다. 거기에 도착하는 데 잠시 시간이 걸렸지 만 입력에 감사드립니다. :) – Chiramisu