복붙노트

[SQL] DB 설계는 하위 유형을 사용하거나하지 않으려면?

SQL

DB 설계는 하위 유형을 사용하거나하지 않으려면?

책, 기사, 참고 : 내가 설계있어 데이터베이스는 3 개 테이블이 있습니다. 각 책이나 문서는 여러 개의 메모를 할 수 있습니다, 내 원래 디자인 기사에 책과 노트에 둘 사항은 '노트'테이블을 이동 즉, 그냥 같았다. 다음은 참고 테이블의 열은 다음과 같습니다 :

NOTE_TYPE는 '책'또는 '기사'중 하나가 될 수 있습니다; note_type는 '문서'인 경우 note_type가 '책'또는 자료의 경우 NOTE_TYPE_ID은 book_id에 대한 FK이다.

즉 올바른 (또는 가장 정규화 된) 디자인 인 경우에 지금은 경이로 시작합니다. 다른 방법은 5 개 테이블을 사용하는 것입니다

책 / 기사 / 노트 / book_notes / article_notes

내가 별도로 책 노트와 문서 메모를 유지할 수 이러한 방식으로, 열이 같다

'노트'{note_id, note_content} 'book_notes'{book_id, note_id} 'article_notes'{articel_id, note_id}

어느 것이 정확한지 또는 더 나은?

해결법

  1. ==============================

    1.어쩌면 다른 접근 방식을 비트 - 당신은 환자와 의사 아형을 가진 사람의 슈퍼처럼, 각각의 하위 유형에 대한 매우 구체적인 열이있을 때 상위 유형 / 하위 유형이 일반적으로 사용된다. 사람 각각에 대해 사람과 환자 및 의사 홀드 매우 특정 컬럼에 대한 모든 데이터 공통를 보유하고 있습니다. 이 예에서는 사용자의 book_notes 및 article_notes 정말 다른 것을하지 않습니다. 차라리 하위 유형으로 슈퍼 책 게시 및 아티클을 고려해 것이다. 그럼 당신은 출판에 FK로 한 주 테이블을 가질 수 있습니다. 당신이 할 수있는 출판의 PK 번호가 예약 (제)의 [PK, FK]와 같은 수 있음을 감안하면 출판, 도서 또는 제에 메모와 함께 결합한다. 이 방법 당신은 단순히 새로운 하위 분류 테이블을 추가하고 주에 대해 아무 것도 변경하지 않음으로써 잡지와 같은 다른 간행물을 추가 할 수 있습니다.

    어쩌면 다른 접근 방식을 비트 - 당신은 환자와 의사 아형을 가진 사람의 슈퍼처럼, 각각의 하위 유형에 대한 매우 구체적인 열이있을 때 상위 유형 / 하위 유형이 일반적으로 사용된다. 사람 각각에 대해 사람과 환자 및 의사 홀드 매우 특정 컬럼에 대한 모든 데이터 공통를 보유하고 있습니다. 이 예에서는 사용자의 book_notes 및 article_notes 정말 다른 것을하지 않습니다. 차라리 하위 유형으로 슈퍼 책 게시 및 아티클을 고려해 것이다. 그럼 당신은 출판에 FK로 한 주 테이블을 가질 수 있습니다. 당신이 할 수있는 출판의 PK 번호가 예약 (제)의 [PK, FK]와 같은 수 있음을 감안하면 출판, 도서 또는 제에 메모와 함께 결합한다. 이 방법 당신은 단순히 새로운 하위 분류 테이블을 추가하고 주에 대해 아무 것도 변경하지 않음으로써 잡지와 같은 다른 간행물을 추가 할 수 있습니다.

    예를 들면 :

    TABLE Publication (
          ID (PK)
        , Title
        , -- more columns common to any publication
    )
    
    TABLE Book (
          ID (PK) = FK to Publication
        , ISBN
        , -- more columns specific to books only
    )
    
    TABLE Article (
        ID (PK) = FK to Publication
        , -- more columns specific to articles only)
    
    TABLE Note (
          ID (PK)
        , PublicationID = FK to Publication
        , NoteText
    )
    

    예약 및 제 테이블에 대한 기본 키는 게시에 대한 외래 키 역할을합니다.

    이제 우리는 또 다른 간행물, 잡지를 추가하는 경우 :

    TABLE Magazine (
        ID (PK) = FK to Publication
        , -- more columns specific to magazines only
    )
    

    우리는 어떤 방법으로 주를 수정할 필요가 없습니다 - 그리고 우리는 단지 잡지에 열을 특정를 추가했습니다.

  2. ==============================

    2.특정 관점에서 그것을 사용에 장기적으로 훨씬 더

    특정 관점에서 그것을 사용에 장기적으로 훨씬 더

    책 / book_notes / 기사 / 기사 노트

    데이터베이스의 설계 원칙으로.

    당신이 자신의 테이블에 단일 엔티티의 속성을 가지고, 시간이 지남에 따라 백업, 데이터 조작 및 데이터 이동성을 고려 할 때 돈을 지불하기 시작합니다.

    둘은 상황에 따라 달라집니다, 정말 절대에서 "더 나은"입니다. 사람들은 맞는이, 학술 데이터베이스 설계자가 칫솔 당 찬장을 생성하는 경향이 찬장에 아무것도 넣어하는 데 사용됩니다.

    당신의 맥락에서, 당신은 SQL 삽입 /의 추가 오버 헤드가 / / 업데이트를 선택하는 대신 하나의 3 개 노트 테이블에 대한 삭제하는 것이 결정할 수 있습니다 것은 가치가 없다. 당신이 "1 노트 테이블"로 가면 장기적으로, 3으로 분할, 당신이 그것을 좋아하지 않는 결정 후를 처음 설계하는 것은 전쟁과 평화를 다시 작성처럼되지 않습니다.

  3. ==============================

    3.논리 데이터 모델을 표시 할 때이 관계는 호라고합니다.

    논리 데이터 모델을 표시 할 때이 관계는 호라고합니다.

    당신이 어떤 노트 중복을 예상하지 않는 경우는 괜찮습니다. 다만 너무 책,하지만 기사 사이.

  4. ==============================

    4.그것은 당신이 하위 입력 수행 할 작업에 따라 달라집니다. 메인 테이블 책과 기사에서 "출판물"의 아류처럼 보인다. 그러나, "출판물"에 대한 테이블이 없습니다. 당신은 당신이 "일반화 전문화 관계형 모델링"의 관점에서 생각하지 않았기 때문에 출판물 검색하거나 할 필요가 없기 때문에인가요? 당신이 웹에이 구절을 보면, 당신은 주제에 대한 좋은 기사를 볼 수 있습니다.

    그것은 당신이 하위 입력 수행 할 작업에 따라 달라집니다. 메인 테이블 책과 기사에서 "출판물"의 아류처럼 보인다. 그러나, "출판물"에 대한 테이블이 없습니다. 당신은 당신이 "일반화 전문화 관계형 모델링"의 관점에서 생각하지 않았기 때문에 출판물 검색하거나 할 필요가 없기 때문에인가요? 당신이 웹에이 구절을 보면, 당신은 주제에 대한 좋은 기사를 볼 수 있습니다.

    당신이 일반화 "출판물"테이블이 필요하지 않습니다 가정하면, 그때는 아마 중 하나를 일반화 "노트"테이블이 필요하지 않습니다. 당신은 메모가 참조 종류의 출판 상관 없습니다 메모를 검색 할 건가요? 얼마나 당신이 게시의 3, 4 종류를 추가 할 전에 될 것입니다?

    이 모든 디자인은 "개념적으로 더 나은"인에 영향을 미칠. 당신은 개념적으로 더 나은 무언가를 원하는 경우에, 당신은 당신이 그것을 실현 여부에 최적화되어 있습니다. 당신은 속도와 단순성에 비해 선 (善)의 다른 측정과 관련하여 최적화 될 수 있습니다.

  5. ==============================

    5.당신의 주요 초점은 노트에 있어야 것 같은데. 하위 유형의 데이터 구조 - 나는 슈퍼를 만들 것이라고 성명을 감안할 때.

    당신의 주요 초점은 노트에 있어야 것 같은데. 하위 유형의 데이터 구조 - 나는 슈퍼를 만들 것이라고 성명을 감안할 때.

    참고 메모 독특한 (슈퍼) 모든 (하위 유형)에 공통적 도서 및 문서의 항목 만하게 모든 것을 포함됩니다.

    슈퍼 필드 참고 :

    일반적인 하위 유형 필드 :

    예약 고유 필드 : (NoteTypeId = 1)

    제 고유 필드 : (NoteTypeId = 2)

    이것은 사람들이 검색하거나 내용, 유형, 제목, 저자 및 날짜의 모든 메모를 검색 할 수 있습니다. 그리고 자세한 내용은이 유형의 세부 사항을 드릴 다운.

    당신은 쉽게 필요에 따라 다른 서브 타입을 추가 할 수 있도록 이것은 또한 성장을 할 수 있습니다. 예를 들어, 블로그 (NoteTypeId = 3) FaceBookPages (NoteTypeId = 4) 등

  6. from https://stackoverflow.com/questions/1654071/db-design-to-use-sub-type-or-not by cc-by-sa and MIT license