2012-06-20 2 views
2

해당 테이블을 하나의 테이블로 병합해야합니까? 까다로운 대안이 있습니까?하나의 필드에 차이가있는 2 개의 SQL 테이블을 결합해야합니까?

Table Unit for a Template table: 


Id (PK) 
ParentId 
Name 
TemplateId (FK) 

Table Unit2 for a Testplan table: 

Id (PK) 
ParentId 
Name 
TestplanId (FK) 

편집 :

왜 테이블 그렇게하지 :

[UnitId] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NOT NULL, 
    [TemplateId] [int] NULL, 
    [TestplanId] [int] NULL, 
    [ParentId] [int] NULL, 

갱신 2 :

1 Template has N Unit 
1 Template has N Testplan 
1 Testplan has N Unit 

이 하나 개의 단위 테이블을 사용하는 관계이다. 그러나 이것은 UnitId의 TemplateId와 TestplanId에서만 작동 할 수 있습니다.

+1

원본 두 테이블에 저장된 개체 간의 관계는 무엇입니까? 일대일 관계가 있습니까? 템플릿의 부모는 항상 템플릿입니까? 모든 템플릿이 테스트 계획인가요? 이 질문에 대답 해보십시오. –

+0

@Norla 내 질문이 업데이트되었습니다. – Elisabeth

+0

글쎄요, 여기서 일하는 데있어 3 가지 다른 유형의 물체, 즉 템플릿, 테스트 계획 및 단위가있는 것처럼 보입니다. 더 구체적으로 말하자면 : Template, TemplateUnit, Testplan, TestplanUnit. 소리가 맞습니까? –

답변

0

:

테이블의 수를 줄이기 위해 노력하는 그들의 의도 된 목적을 당황하게 할 것이다. 객체의 관계형 데이터베이스를 디자인 할 때 각 관계에 대해 두 가지 질문을 던져보십시오. A a B입니까? B이 있습니까?

http://en.wikipedia.org/wiki/Is-a

http://en.wikipedia.org/wiki/Has-a

당신은이-A 일련의 관계를 가지고있다. (특히 has-many) 템플릿에 단위가 있습니다. 템플릿에 테스트 계획이 있습니다. 테스트 플랜에는 유닛이 있습니다 (다른 유닛도보실 수 있습니다).

많은 수의 관계에 대해 속성 테이블에 외래 키 컬럼을 추가합니다 (예 : 유닛에 template_id가 있음).

이와 같은 스키마를 사용하면 어떤 테이블과 어떤 열이 다른 개체와 관련되는지 혼동하지 않습니다. 이렇게하면 매우 쉽게 쿼리 할 수 ​​있습니다.

SELECT * 
FROM Template a 
JOIN TemplateUnit b 
    ON a.id = b.template_id 
JOIN Testplan c 
    ON a.id = c.template_id 
JOIN TestplanUnit d 
    ON c.id = d.testplan_id 

이제 모든 B 열 템플릿 단위 및 모든 D 열 testplan 단위 인 것을 알고있다. 쉬워요.

+0

parent_id는 FK가 아니며 동일한 테이블 (계층 적 항목)의 다른 데이터row의 ID를 가진 필드입니다. 내가 좋아하는 것은 : "테이블의 수를 줄이려고하면 의도 한 목적을 혼란스럽게 할 것입니다."하지만 여기서는 단 하나의 코딩입니다 .- 제가 TemplateUnit과 TestplanUnit을 가질 때 TemplateUnit Unit과 TestplanUnit a Unit입니다. 저는 YES로 둘 다 대답 할 것입니다. 따라서 나는 실제로 Tim Lehner의 해답에 답을 얻은 여기 상속 재산을 가지고있다. – Elisabeth

+0

Unit 테이블에 template_id 또는 testplan_id가 될 FK 열이 필요합니다. 스키마를 심각하게 어지럽히 지 않으면 두 가지를 모두 가질 수 없습니다. (research 3NF) 또한 다른 FK 칼럼을 생각할 때와 같은 방식으로 parent_id를 생각해보십시오. 그것이 실제로 무엇입니까! parent_id는 다른 _table_인지 여부에 관계없이 _different_ 엔티티의 ID입니다. (테이블이 아닌 행의 관점에서 생각해보십시오.) –

+0

조금 확장해야합니다. TemplateUnit _has_ _a_ 상위 템플릿. TestplanUnit _has_ _a_ 상위 테스트 플랜. 그것들은 혼동되어서는 안되는 두 가지 다른 관계입니다. –

4

아니요. 유사하지만 관련이없는 테이블은 병합되어서는 안됩니다.

외래 키 열은 서로 다릅니다. 때때로 하나의 테이블을 가리키며 때로는 다른 테이블을 가리키는 외래 키를 만드는 쉬운 방법이 없습니다.

업데이트 할 때 두 개의 열 (각 외래 키에 하나씩)을 추가하여이 상황을 처리했으며 두 가지 모두를 null로 만들었습니다. 그러나 이제는 모든 템플릿에 정확히 하나의 템플릿 ID가 필요하다는 것을 상상해보십시오. 원래 디자인에서는 TemplateIdNOT NULL을 만들어 쉽게 만들 수 있습니다. 그러나 결합 된 테이블에서 테스트 계획을 만들 수 없기 때문에 그렇게 할 수 없습니다.

이제 누군가가 TestplanIdTemplateId이있는 항목을 추가 한 경우 허용 할 항목이 있다고 상상해보십시오. 옛날 디자인에서는 이것이 불가능했지만, 결합 된 테이블에서는 불가능했습니다.

이 상황은 CHECK 제약 조건을 추가하여 처리 할 수 ​​있지만 이점이 거의 없거나 전혀없는 추가 복잡성을 추가합니다.

+0

내 질문이 업데이트되었습니다. – Elisabeth

0

아니요. 관련이없는 정보가 저장되어 있습니다.
예제에서 템플릿과 테스트 계획은 완전히 관련이없는 엔터티이므로 하나의 테이블에 결합해서는 안됩니다.

+0

Unit.TemplateId는 Template.Id를 참조합니다. 그런데 전혀 관련이 없습니다. – Elisabeth

+0

Template와 Testplan의 관계는 무엇입니까? – Padmarag

0

당신은 쉽게 다음과 같은 열이 하나의 테이블에이 두 테이블을 결합 할 수 있습니다 :

Id (PK) 
ParentId 
Name 
TemplateId (FK) 
TestplanId (FK) 

이 좋은 생각인지? 글쎄요. 본질적으로 동일한 엔티티를 포함하는 두 개의 테이블입니까? 이 질문에 답하기 어려울 경우 쿼리를 만족시키기 위해 두 테이블에서 유니온을 수행 할 것인지 생각해보십시오.

둘 다 ParentId 열이 있습니다. 부모는 항상 자녀와 동일한 유형입니까? 아니면 부모가 완전히 다른 것입니까? 혼합 된 트리 구조를 가지고 있다면, 모든 ID를 하나의 테이블로 원할 것입니다. 두 개의 서로 다른 트리 구조가있는 경우 두 개의 다른 테이블이 필요할 수 있습니다.

마찬가지로 ID가 TemplateId와 TestplanId 인 경우 동일한 테이블에 넣는 것이 좋습니다. 마찬가지로 ID가없는 ID가있는 경우 단일 테이블에 모두 넣는 것이 좋습니다.

원본 두 테이블에 외래 키 제약 조건을 적용하고 키가 NULL이 아니라고 주장 할 수 있습니다. 1 테이블 버전에서는이 작업을 수행 할 수 없습니다.두 키 중 적어도 하나 (또는 ​​정확히 하나)가 NULL이라는 제약 조건을 추가 할 수 있습니다.

0

목표가 상속을 모방하는 것이라면 먼저 discriminator columns에 대해 읽은 다음 그에 따라 제안 된 테이블을 변경하는 것이 좋습니다. 당신은 아마도 몇 가지 고유 제한 조건을 데려 가고 싶다는 것, 그 시점에서

create table UnitList (
     Id int not null primary key 
) 

create table Unit (
     Id int not null primary key 
    , ParentId int null 
    , Name nvarchar(50) not null 
    , UnitListId int not null references UnitList (Id) 
) 

create table Template (
     Id int not null primary key 
    , UnitListId int not null references UnitList (Id) 
) 

create table Testplan (
     Id int not null primary key 
    , UnitListId int not null references UnitList (Id) 
) 

: 당신의 목표는 많은 기관이 공유하는 공통의 단위 테이블을 제공하는 경우

, 당신은 이런 식으로 뭔가를 시도 할 수 있습니다 귀하의 비즈니스 규칙에 따라 단위 테이블. Unit 테이블에 복제본이 필요 없지만 하나의 유닛이 많은 목록에 포함되도록하려면 UnitToList 접합을 만들 수 있습니다.

+0

UnitList 테이블은 CRUD 메서드의 컨텍스트에서 어떻게 사용됩니까? 이전과 같이 Unit, Template, Testplan을 채우는 것을 의미합니다. UnitList에는 무엇이 있습니까? 지금은 여전히 ​​2 개의 테이블 유닛과 UnitList를 가지고 있습니다 ... – Elisabeth

+0

유닛 테이블에 템플릿/testplan의 유닛을 추가하면 유닛 이름에 중복을 허용해야합니다. 일반적으로 테스트 플랜은 템플리트에서 모든 유닛을 가져옵니다 (템플리트가 제거되면 모든 유닛이 제거되지만 테스트 플랜의 유닛은 변경되지 않습니다). – Elisabeth

0

두 테이블이 매우 유사하고 반복적으로 보일지라도 나는 병합해야한다고 생각하지 않습니다. 그들은 어떤 식 으로든 연결되어 있지 않지만 별개의 테이블을 유지하려고했습니다. 문제의 주석에서 다음

관련 문제