복붙노트

[SQL] 저장하는 룩업 테이블 아이디의 순수 데이터 간의 의사

SQL

저장하는 룩업 테이블 아이디의 순수 데이터 간의 의사

나는이 많이 나오면 발견하고 나는 확실히 그것을 접근하는 가장 좋은 방법은 아니에요.

내가 가진 문제는 테이블을 조회하는 외래 키를 사용하거나 요청하는 테이블에서 직접 테이블 값을 조회하여, 완전히 조회 테이블 관계를 피하는 사이의 결정을 만드는 방법이다.

명심해야 할 점 :

가장 좋은 방법은 여기에 있는가, 또는 키 포인트는 고려?

해결법

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

    1.당신은 VARCHAR 기본 키 조회 테이블을 사용할 수 있으며, 기본 데이터 테이블 계단식 업데이트, 자사의 열을 외부 키를 사용합니다.

    당신은 VARCHAR 기본 키 조회 테이블을 사용할 수 있으며, 기본 데이터 테이블 계단식 업데이트, 자사의 열을 외부 키를 사용합니다.

    CREATE TABLE ColorLookup (
      color VARCHAR(20) PRIMARY KEY
    );
    
    CREATE TABLE ItemsWithColors (
      ...other columns...,
      color VARCHAR(20),
      FOREIGN KEY (color) REFERENCES ColorLookup(color)
        ON UPDATE CASCADE ON DELETE SET NULL
    );
    

    이 솔루션은 다음과 같은 장점이 있습니다 :

    이 스레드에서 이렇게 많은 다른 사람들이 "정상화"무엇의 잘못된 생각을 갖고있는 것 같다 나에게 놀라운. 대리 키를 (유비쿼터스 "ID")를 사용하여 정상화와 아무 상관이있다!

    @MacGruber에서 코멘트 재 :

    예, 크기는 요인이다. 이노, 예를 들어, 모든 보조 인덱스 저장 행의 기본 키 값은 주어진 인덱스 값이 발생한 위치. 당신이 더 많은 보조 인덱스 따라서, 기본 키에 대해 "부피가 큰"데이터 형식을 사용하기위한 더 큰 오버 헤드.

    또한이 외래 키에 영향을 미친다; 외래 키 열은 참조하는 기본 키와 동일한 데이터 타입이어야한다. 당신이 50 행 테이블의 기본 키 크기는 중요하지 않습니다 생각 있도록 작은 룩업 테이블을 가질 수 있습니다. 그러나 룩업 테이블은 다른 테이블에서 수백만 또는 수십억 개의 행에서 참조 할 수있다!

    모든 경우에 대한 정답은 없습니다. 모든 답은 다른 경우에 대한 올바른 될 수 있습니다. 당신은 장단점에 대해 배우고, 사례별로 정보통 결정을 내릴하려고합니다.

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

    2.단순한 원자 값의 경우, I는 주로 복잡도 전면이 하나의 상식에 반대되는 경향이있다. 테이블이 모자를 포함하는 것이 좋습니다. 당신은 "비정규"방법을 수행 할 수 있습니다 :

    단순한 원자 값의 경우, I는 주로 복잡도 전면이 하나의 상식에 반대되는 경향이있다. 테이블이 모자를 포함하는 것이 좋습니다. 당신은 "비정규"방법을 수행 할 수 있습니다 :

    CREATE TABLE Hat (
      hat_id INT NOT NULL PRIMARY KEY,
      brand VARCHAR(255) NOT NULL,
      size INT NOT NULL,
      color VARCHAR(30) NOT NULL /* color is a string, like "Red", "Blue" */
    )
    

    또는 당신은 더 "색"표를하여 그것을 정상화 할 수 있습니다 :

    CREATE TABLE Color (
      color_id INT NOT NULL PRIMARY KEY,
      color_name VARCHAR(30) NOT NULL
    )
    
    CREATE TABLE Hat (
      hat_id INT NOT NULL PRIMARY KEY,
      brand VARCHAR(255) NOT NULL,
      size INT NOT NULL,
      color_id INT NOT NULL REFERENCES Color(color_id)
    )
    

    후자의 최종 결과는 일부 복잡성을 추가 한 것입니다 - 대신 :

    SELECT * FROM Hat
    

    이제 말해야한다 :

    SELECT * FROM Hat H INNER JOIN Color C ON H.color_id = C.color_id
    

    그 여분의 큰 거래를 가입되어 있습니까? 아니오 - 관계형 설계 모델의 토대 사실에 - 정규화는 데이터 가능한 불일치를 방지 할 수 있습니다. 그러나 이런 모든 상황은 복잡 조금을 추가하고, 좋은 이유가 아니라면 당신이 그것을하고있는 이유는, 그것의 가치는 질문. 나는 포함하는 수 "좋은 이유를"고려 :

    그 중 어느 것도 적용되지 않으면, 열심히 정상화 다른 (좋은) 이유를 찾아 누를 것입니다. 방금 확인 값이 유효한 값의 특정 (작은) 세트 중 하나입니다 확인하려면, 당신은 더 나은 값이 특정 목록에 있어야합니다라는 제약 조건을 사용하여 길 이죠; 일을 간단하게 유지하고, 필요할 경우 당신은 항상 나중에 별도의 테이블에 "업그레이드"할 수 있습니다.

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

    3.아무도 생각하지 않았다 것은 그것의 데이터가 시간이 지남에 변경할 수 있고, 기록이 역사적 있습니다에 가입하는 경우는 조회 테이블에 참여하지 않을 것입니다. 예는 부품표와 순번 표이다. 벤더는 부품을 떨어 뜨리거나 부품 번호를 변경할 수 있지만, 주문 테이블은 alawys은 주문한시 주문한 정확히 무엇을해야 할 수 있습니다. 따라서 레코드 삽입 할 수있는 데이터를 조회해야하지만 기존 주문에 대한 정보를 얻기 위해 조회 테이블에 가입해서는 안됩니다. 대신 등의 부품 번호와 설명 및 가격, 주문 테이블에 저장해야합니다. 그 가격 변경 기록 데이터를 통해 전파 및 재무 기록이 정확하지 않도록이 espceially 중요합니다. 이 경우, 당신은 또한 업데이 트를 계단식뿐만 아니라 어떤 종류를 사용하지 않도록 할 것입니다.

    아무도 생각하지 않았다 것은 그것의 데이터가 시간이 지남에 변경할 수 있고, 기록이 역사적 있습니다에 가입하는 경우는 조회 테이블에 참여하지 않을 것입니다. 예는 부품표와 순번 표이다. 벤더는 부품을 떨어 뜨리거나 부품 번호를 변경할 수 있지만, 주문 테이블은 alawys은 주문한시 주문한 정확히 무엇을해야 할 수 있습니다. 따라서 레코드 삽입 할 수있는 데이터를 조회해야하지만 기존 주문에 대한 정보를 얻기 위해 조회 테이블에 가입해서는 안됩니다. 대신 등의 부품 번호와 설명 및 가격, 주문 테이블에 저장해야합니다. 그 가격 변경 기록 데이터를 통해 전파 및 재무 기록이 정확하지 않도록이 espceially 중요합니다. 이 경우, 당신은 또한 업데이 트를 계단식뿐만 아니라 어떤 종류를 사용하지 않도록 할 것입니다.

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

    4.rauhr.myopenid.com 썼다 :

    rauhr.myopenid.com 썼다 :

    즉 4 정상 양식을하지 않습니다. 즉 하나의 사실 조회라는 일반적인 실수입니다 : http://www.dbazine.com/ofinterest/oi-articles/celko22

    4 일반적인 형태는 다음과 같습니다 http://en.wikipedia.org/wiki/Fourth_normal_form

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

    5.정규화는 꽤 보편적으로 데이터베이스의 모범 사례의 한 부분으로 간주하고 정상화 그래, 당신이 밖으로 데이터를 밀어 키에 의해 그것을 참조라고합니다.

    정규화는 꽤 보편적으로 데이터베이스의 모범 사례의 한 부분으로 간주하고 정상화 그래, 당신이 밖으로 데이터를 밀어 키에 의해 그것을 참조라고합니다.

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

    6.아무도 다른 두 번째 점 해결되지 않았기 때문에 : 때문에 모든 조인에 대한 쿼리가 될 때 길고 어려운 읽고 쓰기를, 뷰는 일반적으로 그 해결됩니다.

    아무도 다른 두 번째 점 해결되지 않았기 때문에 : 때문에 모든 조인에 대한 쿼리가 될 때 길고 어려운 읽고 쓰기를, 뷰는 일반적으로 그 해결됩니다.

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

    7.당신은보기가 조회를 얻을 가지고, 그 견해에 대하여 항상 프로그램에 대한 규칙을 만들 수 있습니다.

    당신은보기가 조회를 얻을 가지고, 그 견해에 대하여 항상 프로그램에 대한 규칙을 만들 수 있습니다.

    이것에보기를 최적화하고 테이블의 변화에 ​​코드를 방지 할 수 있습니다.

    오라클에서는, 당신도 혹시 필요한 경우 구체화 된 뷰에보기를 변환 할 수 있습니다.

  8. from https://stackoverflow.com/questions/383026/decision-between-storing-lookup-table-ids-or-pure-data by cc-by-sa and MIT license