복붙노트

[SQL] SQL 데이터베이스 테이블에서 다형성?

SQL

SQL 데이터베이스 테이블에서 다형성?

나는 현재와 같은 같은 '기본 필드'로 구성 내 데이터베이스에 여러 테이블을 가지고 :

name character varying(100),
description text,
url character varying(255)

하지만 영화 테이블 RELEASE_DATE있는 동안, 예산 등 tv_series이 필드 시즌, 에피소드, 방송을 가지고 예를 들어입니다 기본 테이블의 여러 전문이

이제 처음이 문제가되지 않습니다,하지만 난이 전문 테이블에 외래 키와 두 번째 테이블라는 linkgroups을 만들려고합니다. 즉 어떻게 든 자체 내에서 정상화해야합니다.

내가 들었이를 해결하는 한 가지 방법은 키 - 값 쌍 테이블로 정상화이지만,이 '데이터베이스 내에서-A-데이터베이스'기법의 일종이기 때문에 내가 그 생각처럼하지, 난 몰라 특정 키 / 필드가 필요하거나 특별한 형식을 요구하는 방법이, 그리고 그것을 가져 오기 및 주문 데이터 이후에 큰 고통이 될 것입니다.

나는 더 나은 여러 테이블 사이 또는 '공유'가 기본 키에 지금은 방법을 찾고 있어요 그래서 : 방법은 일반 테이블과 여러 전문 테이블을함으로써 그것을 정상화.

해결법

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

    1.네, 문제는 하나의 하위 유형의 하나의 객체가 부모 클래스의 특정 행을 참조 할 수 있습니다. @Jay S에 의해 주어진 예에서 시작,이 시도 :

    네, 문제는 하나의 하위 유형의 하나의 객체가 부모 클래스의 특정 행을 참조 할 수 있습니다. @Jay S에 의해 주어진 예에서 시작,이 시도 :

    create table media_types (
      media_type     int primary key,
      media_name     varchar(20)
    );
    insert into media_types (media_type, media_name) values
      (2, 'TV series'),
      (3, 'movie');
    
    create table media (
      media_id       int not null,
      media_type     not null,
      name           varchar(100),
      description    text,
      url            varchar(255),
      primary key (media_id, media_type),
      foreign key (media_type) 
        references media_types (media_type)
    );
    
    create table tv_series (
      media_id       int primary key,
      media_type     int check (media_type = 2),
      season         int,
      episode        int,
      airing         date,
      foreign key (media_id, media_type) 
        references media (media_id, media_type)
    );
    
    create table movies (
      media_id       int primary key,
      media_type     int check (media_type = 3),
      release_date   date,
      budget         numeric(9,2),
      foreign key (media_id, media_type) 
        references media (media_id, media_type)
    );
    

    이것은 @ 마이크 g 언급 끊긴 아형의 일례이다.

    @Countably 무한하고 @ 피터에 의해 다시 코멘트 :

    두 테이블에 INSERT 두 삽입 문을 필요로한다. 하지만 그 SQL에서 또한 자식 테이블이 언제든지 사실이다. 그것은 할 수있는 평범한 일입니다.

    UPDATE는 두 문장이 필요할 수 있습니다,하지만 당신은 하나 개의 문장에서 그것을 할 수 있도록 RDBMS의 일부 브랜드, 가입 구문을 사용하여 멀티 테이블 UPDATE를 지원합니다.

    데이터를 조회 할 때, 당신은 단순히 당신은 단지 일반적인 열에 대한 정보가 필요하면 미디어 테이블을 조회하여 그것을 할 수 있습니다 :

    SELECT name, url FROM media WHERE media_id = ?
    

    당신이 영화를 쿼리하는 알고 있다면, 당신은 하나와 함께 영화 관련 정보를 얻을 수 있습니다 조인

    SELECT m.name, v.release_date
    FROM media AS m
    INNER JOIN movies AS v USING (media_id)
    WHERE m.media_id = ?
    

    주어진 미디어 항목에 대한 정보를 원하고, 당신이 무슨 타입인지 알 수없는 경우, 당신은 단지 하나의 하위 테이블이 일치 할 것을 알고, 모든 하위 테이블에 가입해야 할 것이다 :

    SELECT m.name, t.episode, v.release_date
    FROM media AS m
    LEFT OUTER JOIN tv_series AS t USING (media_id)
    LEFT OUTER JOIN movies AS v USING (media_id)
    WHERE m.media_id = ?
    

    주어진 미디어는 영화, t에서 모든 열 경우. * NULL이됩니다.

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

    2.테이블 전문 정보로의 오프 확장과 주요 기본 데이터 테이블을 사용하는 것이 좋습니다.

    테이블 전문 정보로의 오프 확장과 주요 기본 데이터 테이블을 사용하는 것이 좋습니다.

    전의.

    basic_data
    id int,
    name character varying(100),
    description text,
    url character varying(255)
    
    
    tv_series
    id int,
    BDID int, --foreign key to basic_data
    season,
    episode
    airing
    
    
    movies
    id int,
    BDID int, --foreign key to basic_data
    release_data
    budget
    
  3. ==============================

    3.이 PostgreSQL의 태그 때문에, 당신은 http://www.postgresql.org/docs/8.1/static/ddl-inherit.html보고 있지만,주의 사항을주의 할 수있다.

    이 PostgreSQL의 태그 때문에, 당신은 http://www.postgresql.org/docs/8.1/static/ddl-inherit.html보고 있지만,주의 사항을주의 할 수있다.

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

    4.당신이 관계형 세계에서 '분리 된 서브 타입'라고 찾고 있습니다. 그들은 언어 수준에서 SQL에서 지원되지 않습니다,하지만 더 많거나 적은 SQL의 상단에 구현 될 수있다.

    당신이 관계형 세계에서 '분리 된 서브 타입'라고 찾고 있습니다. 그들은 언어 수준에서 SQL에서 지원되지 않습니다,하지만 더 많거나 적은 SQL의 상단에 구현 될 수있다.

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

    5.당신은 주요 분야 플러스 각 특정 사건에 대해 동일한 UID와 UID 다음 확장 테이블과 하나 개의 테이블을 만들 수 있습니다. 당신이보기를 만들 수있는 별도의 테이블처럼 다음을 조회합니다.

    당신은 주요 분야 플러스 각 특정 사건에 대해 동일한 UID와 UID 다음 확장 테이블과 하나 개의 테이블을 만들 수 있습니다. 당신이보기를 만들 수있는 별도의 테이블처럼 다음을 조회합니다.

  6. ==============================

    6.어떻게 두 단계에서 할 필요없이 삽입하고 업데이트를 할 것, 빌 Karwin가 제시 한 분리 된 하위 접근 방식을 사용하십니까?

    어떻게 두 단계에서 할 필요없이 삽입하고 업데이트를 할 것, 빌 Karwin가 제시 한 분리 된 하위 접근 방식을 사용하십니까?

    가져 오기 데이터, 내가 조인하고 (내가 여기에 MS SQL 서버를 이야기하고있다) 여러 테이블에 영향을주기 때문에 선택이 해당 뷰에 특정 MEDIA_TYPE하지만 AFAIK 내가 캔트 갱신 또는 삽입에 기초한보기를 소개 할 수 있습니다. natually 및 저장 프로 시저없이 -이 두 가지 작업을 수행하지 않고 수행 할 수 있습니다.

    감사

  7. ==============================

    7.질문은 아주 오래하지만 현대의 PostgreSQL 버전 또한 JSON / jsonb / hstore 유형을 사용하여 고려 가치가있다. 예를 들면 :

    질문은 아주 오래하지만 현대의 PostgreSQL 버전 또한 JSON / jsonb / hstore 유형을 사용하여 고려 가치가있다. 예를 들면 :

    create table some_table (
        name character varying(100),
        description text,
        url character varying(255),
        additional_data json
    );
    
  8. from https://stackoverflow.com/questions/561576/polymorphism-in-sql-database-tables by cc-by-sa and MIT license