2009-12-31 2 views
1

내가 기본 키 ida의 전문 버전을 나타냅니다 테이블 b있는 테이블 a이 (이것은 모든 a이처럼 추적 할 수있는 동일한 특성, 플러스의 b -ness에 일부 특정이있다 - 후자는 모두 그 는 b에 저장됩니다. b의 기본 키를 a.id에 대한 외래 키로 사용하여 이것을 표현하기로 결정한 경우에 대한 적절한 용어는 a과 관련되어 있습니까?"추가 기능"테이블의 올바른 이름은 무엇입니까?

studentteacher 추가 테이블이있는 실제 테이블의 예는 person 일 수 있습니다. studentteacher (예 : TA) 일 수도 있지만 모두 동일합니다. person입니다.

나는이 테이블을 a의 '자식 테이블'이라고 부르지 만, 이미 구매 테이블의 라인과 같이 '세부 테이블'의 동의어로 사용하고 있습니다.

+0

리팩터링 전후에 A와 B가 어떻게 생겼는지에 대한 실제 예를 얻을 수 있습니까? –

+0

리팩터가 없으므로 전후에 없습니다. :) 저는 디자인의 이름을 묻습니다. 구체적으로'a'와 관련하여'b'가 무엇인지 부릅니다. – Kev

답변

3

디자인은 Concrete Table Inheritance입니다.

테이블 A을 확장하는 구체적인 테이블 B을 호출합니다.

이 관계는 일대일입니다.


다른 답변은 확장 테이블과 관련된 열만 저장하도록 제안했습니다. 이 디자인은 Class Table Inheritance이라고합니다.

+0

'b'를'a' *의 확장자로 간단하게 부르는 것이 부적절할까요? (즉, SQL 테이블 컨텍스트에서 다른 의미가 있습니까?) – Kev

+0

예, 클래스 테이블 상속이 있습니다. 나는 처음에는 Concrete처럼 들렸지 만, Neil의 답변을 통해 내가 명확하게 설명하지 않았다는 것을 알게 된 후에이를 교정했다. – Kev

+0

물론 대체 문구가 좋습니다. 이러한 패턴을 잘 사용하는 방법에 대한 자세한 내용은 Martin Fowler의 저서 PofEAA를 참조하십시오. –

1

좋아,이 주제에서 일종의 일이지만 우선 먼저 B가 A 열을 모두 가지고 있습니까? 추가 열만 있어야하며, foriegn 키를 사용하여 A를 참조하는 경우는 특히 필수입니다.

"상세 (들)"예를 들어

, 내 표 A는 "자동차"내 표 B는 "CarDetails"닐로

+0

죄송합니다. 문구가 명확하지 않아서 편집하려고합니다. – Kev

+0

FK *가 * PK이므로 세부 정보 테이블이 아닙니다. 그것은 M : 1이 아닌 1 : 1 관계입니다. – Kev

+0

그 1 : 1 또는 1 : M의 그것의 세부 사항 테이블. –

0

것입니다 말할 수 기록은 일반적으로 불린다 "에 추가" N은 외래 키를 통해 표 A의 표 A를 참조하는 경우 두 곳에서 열을 가져서는 안됩니다.

당신의 설명이 객체 지향 프로그래밍에서 상속과 약간 비슷하게 들리는 것. 개인적으로이 경우 특정 명명 규칙을 사용하지 않습니다. 나는 그것이 무엇인지 이름을 짓고 나는 그것이 무엇인지 B라고지었습니다. 예를 들어, 나는이있을 수 있습니다

CREATE TABLE People 
(
    people_id  INT    NOT NULL, 
    first_name  VARCHAR(40)  NOT NULL, 
    last_name  VARCHAR(40)  NOT NULL, 
    ... 
    CONSTRAINT PK_People PRIMARY KEY CLUSTERED (people_id) 
) 
GO 

CREATE TABLE My_Application_Users 
(
    people_id   INT    NOT NULL, 
    user_name   VARCHAR(20)  NOT NULL, 
    security_level  INT    NOT NULL, 
    CONSTRAINT PK_My_Application_Users PRIMARY KEY CLUSTERED (people_id), 
    CONSTRAINT UI_My_Application_Users_user_name UNIQUE (user_name) 
) 
GO 

을이 그렇게 내 이름 열이 너무 짧거나 등, 널 (null)을 허용해야 너무 길거나 것을 말하지 마세요, 그냥 예입니다)

+0

둘 다 가지고 있지 않습니다. 'b'는'b'에 특유한 것을 가지고 있으며, 더 일반적인 정보는'a'에 FK/PK입니다. – Kev

+0

예, OOP 상속과 매우 비슷합니다. – Kev

0

a와 관련하여 b의 적절한 용어는 무엇입니까? 레코드가 하위에 존재하기 위해서는, 먼저 상위에 존재해야하기 때문에

B 표는 표 A (부모)의 자식이다.

테이블은 컨텍스트에 따라 일대 다 또는 다 대일 관계를 기반으로 모델링되어야하며 선택 사항 또는 필수 항목 일 수 있습니다. 두 세트의 목록을 함께 연결하는 테이블은 관련된 모든 테이블에 대해 다 대일 방식으로 다른 테이블과 관련됩니다. 예를 들어, users, groupsuser_groups_xref - user_groups_xrefuser 레코드의 수많은 특정 사용자 인스턴스와 groups 테이블과 동일한 관계를 지원할 수 있습니다.

일대일 관계에는 아무런 의미가 없습니다. 이러한 테이블은 하나의 테이블이어야하기 때문에 절대 존재해서는 안됩니다.

+0

포인트가 있습니다. '사람'은 '학생'이 아닐 수도 있습니다. 그러면 왜 '사람'에 학생 데이터의 열이 있어야합니까? 여러 유형의 전문 분야가있는 경우 테이블에 많은 열이 있고 일반적으로 드문 드문됩니다. 이것은 훨씬 조직화되어 있습니다. Bill의 링크처럼 Concrete 라우트를 사용하면 데이터 중복이 발생하고 동기화 문제가 걱정됩니다. – Kev

+0

@Kev : 외래 키가있는 형식 코드 열의 용도입니다. 또는 관계는 사용자/그룹과 유사하게 모델링 될 수 있습니다. 그것은 모두 비즈니스 규칙에 따라 다릅니다. –

+0

'사람'이 둘 이상의 특수 유형이 될 수없는 경우. – Kev