복붙노트

[SQL] 왜 외부 키는 더 많은 연습보다 이론적으로 사용됩니까?

SQL

왜 외부 키는 더 많은 연습보다 이론적으로 사용됩니까?

공부하면 관계형 이론 외래 키는 물론, 필수입니다. 그러나 실제로는, 모든 장소에 나는 테이블 제품을 근무하고 항상 쿼리에서 명시 적으로 키를 지정하는 대신 DBMS에서 외래 키에 의존하여 수행 조인.

이런 식으로, 당신은 물론 예기치 않은 결과를 가지고 외래 키, 될 운명되지 않은 필드를 기준으로 두 테이블을 조인 할 수있다.

왜 그 생각 하는가? 의 DBMS는 조인 및 제품은 외래 키에 의해 만들어 질 시행하지 않나요?

편집 : 모든 해답을 주셔서 감사합니다. 그것은 FKS의 주된 이유는 참조 무결성 것을 지금 나에게 분명하다. 당신은 DB, 모델의 모든 관계 (즉 화살표를 ERD에서) 당신이 당신의 DBMS에 등을 정의 여부, 적어도 이론적으로, 외부 키가 될 디자인 할 경우, 그들은 의미 FKS입니다. 나는 FKS없는 필드로 테이블을 조인 할 필요가 상상할 수 없다. 누군가가 의미가 있습니다 예를 들어 줄 수 있습니까?

추신 : M 관계 단지 단순화하기 위해 생략, 별도의 테이블과 외국하지 키가 될 : 나는 N이 사실에 대해 알고 있어요.

해결법

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

    1.외래 키 제약 조건이 존재하는 이유는 참조 행이 존재한다는 것을 보장하는 것입니다.

    외래 키 제약 조건이 존재하는 이유는 참조 행이 존재한다는 것을 보장하는 것입니다.

    "외래 키 식별하는 열 또는 열 또는 다른 테이블 열 집합을 의미 한 테이블의 열들의 집합. 참조하는 열 중 하나 개의 행에있는 숫자는 참조 테이블 내의 단일 행에 발생한다.

    따라서, 참조 테이블의 행이 참조 된 테이블에 존재하지 않는 값을 포함 할 수 없습니다 (잠재적으로 NULL을 제외). 이 방법 참조 링크 정보를 함께 만들어 질 수 있으며이 데이터베이스 정규화의 필수적인 부분입니다. "(위키 백과)

    RE : 귀하의 질문 : "나는 FKS없는 필드로 테이블을 조인 할 필요가 상상할 수 없다"

    외국 키 제약 조건을 정의 할 때 참조하는 테이블의 열 (들) 참조 테이블의 기본 키, 또는 적어도 후보 키해야합니다.

    일을 조인하는 경우, 기본 키 또는 후보 키를 사용하여 가입 할 필요가 없다.

    다음은 감각을 만들 수있는 예입니다 :

    CREATE TABLE clients (
        client_id       uniqueidentifier  NOT NULL,
        client_name     nvarchar(250)     NOT NULL,
        client_country  char(2)           NOT NULL
    );
    
    CREATE TABLE suppliers (
        supplier_id       uniqueidentifier  NOT NULL,
        supplier_name     nvarchar(250)     NOT NULL,
        supplier_country  char(2)           NOT NULL
    );
    

    다음 쿼리로 다음과 같습니다 :

    SELECT 
        client_name, supplier_name, client_country 
    FROM 
        clients 
    INNER JOIN
        suppliers ON (clients.client_country = suppliers.supplier_country)
    ORDER BY
        client_country;
    

    이러한 메이크업 감각을 결합하는 또 다른 경우는 PostGIS와와 SQL Server 2008 또는 포스트 그레스와 같은 지리 공간 기능을 제공하는 데이터베이스입니다. 당신은이 같은 쿼리를 할 수있을 것입니다 :

    SELECT
        state, electorate 
    FROM 
        electorates 
    INNER JOIN 
        postcodes on (postcodes.Location.STIntersects(electorates.Location) = 1);
    

    출처 : ConceptDev - SQL 서버 2008 지리 : STIntersects, STArea

    당신은 게시물에 대한 허용 대답에 다른 유사한 지리 예를 볼 수있다 "SQL 2008 쿼리 문제 - LatLong의이 지리 다각형에 존재?"

    SELECT 
        G.Name, COUNT(CL.Id)
    FROM
        GeoShapes G
    INNER JOIN 
        CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
    GROUP BY 
        G.Name;
    

    이들은 모두 유효한 SQL 외국 키와 후보 키와는 아무 상관이없는, 여전히 연습에 유용 할 수있는 조인입니다.

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

    2.외래 키는 데이터베이스 무결성을 유지보다 조인 함께 할 적은있다. 그 증거는 당신도 반드시 이해가되지 않는 방법으로, 당신이 원하는 어떤 방식으로 테이블을 조인 할 수 있다는 것입니다.

    외래 키는 데이터베이스 무결성을 유지보다 조인 함께 할 적은있다. 그 증거는 당신도 반드시 이해가되지 않는 방법으로, 당신이 원하는 어떤 방식으로 테이블을 조인 할 수 있다는 것입니다.

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

    3.외래 키는 단지 ER 모델의 엔티티 사이의 관계가 관계형 모델의 두 관계 사이의 동등 조인 반영되는 경우 참조 무결성을 적용 할 수 있습니다.

    외래 키는 단지 ER 모델의 엔티티 사이의 관계가 관계형 모델의 두 관계 사이의 동등 조인 반영되는 경우 참조 무결성을 적용 할 수 있습니다.

    이것은 항상 사실이 아니다.

    여기에 내가 얼마 전에 쓴 내 블로그에 기사의 예는 다음과 같습니다

    이 모델은 상품 및 가격 범위를 설명합니다 :

    그리고 여기 모델의 관계 구현입니다 :

    CREATE TABLE Goods (ID, Name, Price)
    CREATE TABLE PriceRange (Price, Bonus)
    

    당신이 볼 수 있듯이, PriceRange 테이블은 하나의 가격 관련 속성, 가격이 있지만,이 모델은 두 가지 속성이 있습니다 StartPrice 및 EndPrice을.

    관계형 모델은 세트와 PriceRange 쉽게 SQL 작업을 사용하여 재구성 할 수있는 개체를 변환 할 수 있기 때문이다.

    Goods
    ID  Name               Price
    1   Wormy apple        0.09
    2   Bangkok durian     9.99
    3   Densuke watermelon 999.99
    4   White truffle      99999.99
    
    PriceRange
    Price   Bonus
    0.01       1%
    1.00       3%
    100.00    10%
    10000.00  30%
    

    우리는 각 범위의 하한만을 낮은 저장합니다. 어퍼는 쉽게 유추 할 수있다 바인딩됩니다.

    다음은 각 좋은에 대한 보너스를 찾을 수있는 쿼리는 다음과 같습니다

    SELECT  *
    FROM    Goods
    JOIN    PriceRange
    ON      PriceRange.Price =
            (
            SELECT  MAX(Price)
            FROM    PriceRange
            WHERE   PriceRange.Price <= Goods.Price
            )
    

    우리는이 관계 모델을 구현하는 것을 ER 모델 꽤 잘 볼 수 있지만 작업이 그들이 동등 조인하지 바인딩하는 데 사용 이후에는 외래 키는, 이러한 관계 사이에 선언 할 수 없습니다.

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

    4.아니, 집행은 필요하지 않습니다; 그러한 열 수 과부하로, 몇 가지 유용한 기능을 허용합니다. 사용 이러한 종류의 이상적 아니지만, 몇 가지 실제 상황에서 유용합니다.

    아니, 집행은 필요하지 않습니다; 그러한 열 수 과부하로, 몇 가지 유용한 기능을 허용합니다. 사용 이러한 종류의 이상적 아니지만, 몇 가지 실제 상황에서 유용합니다.

    외래 키 제약 조건에 대한 적절한 사용하는 것과 그냥; 자신의 참조 행이 존재하는 것을 보장 주어진 컬럼에 추가 된 값에 제약.

    주어진 스키마에 대한 외래 키 제약 조건의 중요한 부족 나쁜 "냄새", 그리고 몇 가지 심각한 디자인 문제를 나타낼 수 있음에 유의해야한다.

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

    5.당신은 어떤 식에 가입 할 수 있습니다. 당신이 당신의 데이터베이스에서 외부 키를 정의 여부 중요하지 않다. 외부 키는 INSERT가 / UPDATE / DELETE, SELECT하지 제한.

    당신은 어떤 식에 가입 할 수 있습니다. 당신이 당신의 데이터베이스에서 외부 키를 정의 여부 중요하지 않다. 외부 키는 INSERT가 / UPDATE / DELETE, SELECT하지 제한.

    왜 많은 프로젝트는 외래 키를 정의 건너 뛸 수 있습니까? 몇 가지 이유가 있습니다 :

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

    6.당신이 설명하는 방식으로 사용 외국 키는 사용할 수 의미하는 방법이 아니다. 그들은 확실히 기록이 논리적으로 다른 곳에서, 해당 기록의 존재에 의존하는 경우 기록을 대응하는 사실이 있다는 것을 것을 확인하기위한 것입니다.

    당신이 설명하는 방식으로 사용 외국 키는 사용할 수 의미하는 방법이 아니다. 그들은 확실히 기록이 논리적으로 다른 곳에서, 해당 기록의 존재에 의존하는 경우 기록을 대응하는 사실이 있다는 것을 것을 확인하기위한 것입니다.

    나는 옵션 A는 쉽게 선택, 개발자 / DBA가 자신의 테이블과 필드, 또는 (B)에 대한 중 (A) 개발자 좋은 이름에 시간이있는 경우 광범위한 외래 키 제약 조건을 정의 있다고 생각합니다. 나는 두 경우 모두에서 일했습니다. 다양한 제약 조건에 의존 한 경우 질서를 유지하고 정말 엉망이 될 수있는 일을 망쳐 사람들을 유지합니다.

    그것은 개발 과정에서 현재까지의 모든 외래 키 제약 조건을 유지하기 위해 노력, 당신은 거의 시간을 가지고 다른 가치가 높은 업무에 지출 할 수있는 시간이 많이 걸립니다. 반면에, 당신은 좋은 명명 규칙이 상황에서, 외부 키는 즉시 명확하다. 개발자는 외래 키를 검색하거나 작동하는지 확인하기 위해 쿼리를 시도 할 필요가 없습니다; 그들은 단지 관계를 볼 수 있습니다.

    나는 다른 팀의 수는 데이터베이스가 증가하여 성장 외래 키 제약 신속하게 도움이 될 것 같아요. 그것은 일관된 명명을 적용하는 것이 어렵게된다; DB를의 지식 조각이된다; DB 작업은 다른 팀에 대한 의도하지 않은 결과를하기가 쉽다.

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

    7.때문에 실제로 이론은 충분하지 않다)

    때문에 실제로 이론은 충분하지 않다)

    이론은 현실 세계에서 처리해야하는 모든 가능성을 고려하는 유연한 충분하지 않기 때문에 진심으로, 내 경험에 주로. 오직 당신 만이 (과부하 열처럼, 또는 더 일반적 일) 당신의 DB에 저장할 필요가있는 한 가지 매우 이상한 경우에, 당신은 FK을 얻고 DAL에서 구현해야합니다.

    당신은 완전히 표준화 된 방법 (예를 들어)에 보관 할 수있는 솔루션을 개발 할 수 있지만, 대부분의 경우 작업이 필요 및 / 또는 최종 결과는 충분히 가치가 아니다.

    내 두 센트.

  8. ==============================

    8.DBMS의 여전히 핵심 규칙에 따라 작업하는 동안 솔루션의 넓은 수 있도록 내장되어 있습니다.

    DBMS의 여전히 핵심 규칙에 따라 작업하는 동안 솔루션의 넓은 수 있도록 내장되어 있습니다.

    제한 대부분의 개발은 SQL / 저장 프로 시저의 전용 DBA 또는 검토가 발생하지 않습니다 특히, 엄청난 기능을 제한 할 정의 된 외래 키에 합류했다.

    데이터 액세스 계층에 따라 그 말했다 데, 당신은 사용 기능에 외국 키를 구성해야 할 수 있습니다. SQL에 대한 예를 Linq를하십시오.

  9. ==============================

    9.DB / 관계형 유형의 사람들이 코드가 아닌 쓰기 많은 일을하거나 테이블을 설계하기 때문에 관계형 이론에서 알 수 있듯이 외부 키는 자주 사용되지 않습니다. 프로그래머는 코드 / 디자인 테이블을 작성하거나 테이블이 설계 방법에 많은 영향을 미친다.

    DB / 관계형 유형의 사람들이 코드가 아닌 쓰기 많은 일을하거나 테이블을 설계하기 때문에 관계형 이론에서 알 수 있듯이 외부 키는 자주 사용되지 않습니다. 프로그래머는 코드 / 디자인 테이블을 작성하거나 테이블이 설계 방법에 많은 영향을 미친다.

  10. ==============================

    10.당신은 어떤 종류의 데이터베이스 응용 프로그램에서 작동합니까? 자주 볼 수 있다는 이론은 경우에 제약이 매우 유용 할 수있는 데이터베이스 원료를 사용하는 방법에 대한 것입니다. 실제로, 데이터베이스는 종종 큰 응용 프로그램의 백 엔드로 사용된다. 대부분의 경우, 이러한 응용 프로그램은 거래 자체를 확인해야하고, 그것은 데이터베이스에 반복 노력을 낭비 될 것이다.

    당신은 어떤 종류의 데이터베이스 응용 프로그램에서 작동합니까? 자주 볼 수 있다는 이론은 경우에 제약이 매우 유용 할 수있는 데이터베이스 원료를 사용하는 방법에 대한 것입니다. 실제로, 데이터베이스는 종종 큰 응용 프로그램의 백 엔드로 사용된다. 대부분의 경우, 이러한 응용 프로그램은 거래 자체를 확인해야하고, 그것은 데이터베이스에 반복 노력을 낭비 될 것이다.

    예를 들어, 영업 응용 프로그램을 고려하십시오. 누군가의 주문을 입력 할 때, 그것은 아마도 주소 나 신용 카드 정보를 얻기 위해 데이터베이스에 고객을 찾을 것입니다. 이 고객을 찾을 수없는 경우, 합리적인 뭔가를 프로그래밍 할 것입니다. 이 더 고객이 없었 발견하는 주문 테이블에 행을 삽입하려고 할 때까지 기다리는 경우, 느리고 덜 편리 피드백을 얻을 것입니다.

    뭔가 데이터베이스의 무결성을 유지해야하지만, DBMS 자체 내에서 그 일을 항상 가장 좋은 방법이 아니다.

  11. ==============================

    11.외부 키는 특히 그들에게 실행 매뉴얼 쿼리가 데이터베이스에 매우 중요하다, 또는 적극적으로 개발 소프트웨어를 가지고있다. 데이터베이스에서 실행되는 모든 검증되지 않은 쿼리 오류를 포함 할 가능성이있다. 같은 외래 키와 같은 제약 조건 불일치가 데이터에 도입되기 전에 이러한 오류를 강조하는 역할을한다.

    외부 키는 특히 그들에게 실행 매뉴얼 쿼리가 데이터베이스에 매우 중요하다, 또는 적극적으로 개발 소프트웨어를 가지고있다. 데이터베이스에서 실행되는 모든 검증되지 않은 쿼리 오류를 포함 할 가능성이있다. 같은 외래 키와 같은 제약 조건 불일치가 데이터에 도입되기 전에 이러한 오류를 강조하는 역할을한다.

    이러한 제약은 스키마의 디자이너에 의해 적용, 그들은 (들)하는 모델의 데이터 유적 그가 예상 있는지 확인합니다. 제약이없는이있는 경우, 조만간 쿼리는 약간의 불일치를 소개합니다. 불일치 쿼리에서 예기치 않은 결과로 이어질, 및 역방향하기가 매우 어려운 것입니다.

  12. ==============================

    12.나는 관계형 데이터베이스가 표준이되었다 훨씬 이전부터, 몇 십 년 동안 프로그래밍을했습니다. 나 자신에게 PHP를 가르쳐 때 내가 처음 MySQL의 작업을 시작했을 때, 나는 외래 키 옵션을보고 가장 먼저 생각이었다 "와우! 그 지체입니다." 단지 바보 이유는 실험실 지시 현실한다고 생각합니다. 당신이 지금까지 변경되지 않을 것입니다 응용 프로그램을 코딩하는 않는 유일한 옵션 중 하나를 빌드 이상의 테이블에 또는 창조적 인 솔루션을 가지고 올 경우, 당신은 강철 주조에서 응용 프로그램을 포장하고 즉시 분명했습니다.

    나는 관계형 데이터베이스가 표준이되었다 훨씬 이전부터, 몇 십 년 동안 프로그래밍을했습니다. 나 자신에게 PHP를 가르쳐 때 내가 처음 MySQL의 작업을 시작했을 때, 나는 외래 키 옵션을보고 가장 먼저 생각이었다 "와우! 그 지체입니다." 단지 바보 이유는 실험실 지시 현실한다고 생각합니다. 당신이 지금까지 변경되지 않을 것입니다 응용 프로그램을 코딩하는 않는 유일한 옵션 중 하나를 빌드 이상의 테이블에 또는 창조적 인 솔루션을 가지고 올 경우, 당신은 강철 주조에서 응용 프로그램을 포장하고 즉시 분명했습니다.

    이러한 초기 평가는 내가 건너 온 모든 단일 실제 생산 응용 프로그램에서 태어났다. 뿐만 아니라 제약 조건이 상당히 일체의 수정 속도를 느리게합니까, 그들이 만드는 거의 불가능 응용 프로그램, 비즈니스에 필요한 무언가의 성장.

    내가 테이블에 어떤 제약 조건에 대한 발견 한 유일한 이유는 게으른 코더입니다. 검사 데이터 무결성 깨끗한 코드를 작성 원치 않음.

    남자 이름

  13. ==============================

    13.좋은 질문. SQL과 같은 구문이없는 이유가 항상 궁금했다

    좋은 질문. SQL과 같은 구문이없는 이유가 항상 궁금했다

    SELECT tbl1.col1, tbl2.col2
      FROM tbl1
      JOIN tbl2 USING(FK_tbl1_tbl2)
    

    어디 FK_tbl1_tbl2는 테이블 사이에 외래 키 제약 조건이다. 이 믿을 수 없을만큼 훨씬 더 유용한 자연이 가입 또는 오라클의 사용 (COL1, COL2)한다는 것이다.

  14. ==============================

    14.주된 이유는 대부분의 MySQL의 GUI 도구에서 쿼리 (등 Navicat는, MySQL은,)없이을 설정하는 방법은 없습니다입니다

    주된 이유는 대부분의 MySQL의 GUI 도구에서 쿼리 (등 Navicat는, MySQL은,)없이을 설정하는 방법은 없습니다입니다

    바보 같은 소리는하지만 나뿐만 아니라 내가 구문이 기억하지 않기 때문에이 유죄 해요 : /

  15. ==============================

    15.나를 위해 그것의 일부는 그 (그리고 예,이 절름발이 변명입니다) 외래 키를 추가하기위한 MS의 SQL 서버 관리 스튜디오에서 UI가 끔찍한입니다.

    나를 위해 그것의 일부는 그 (그리고 예,이 절름발이 변명입니다) 외래 키를 추가하기위한 MS의 SQL 서버 관리 스튜디오에서 UI가 끔찍한입니다.

    외부 키는 "표 A에 열 X의 값은 표 B에 열 Y에 표시해야한다"고 제약 조건이지만, SSMS에서이를 지정하기위한 UI는 명확하게 어떤 어떤 테이블 당신과 함께있는 거 메싱, 아닙니다 그래서 자식 테이블, 그리고 부모 테이블.

    이 작업 듯 때까지 외국 키를 생성 했어마다, 시행 착오이었다.

  16. ==============================

    16.나는 자동으로 암시 적으로 모든 외부 키 테이블을 조인 SQL 언어의 잘 모르는 것 같아요. 나는 코드 생성 및 데이터들을 추론보고 도구를 사전을 본 적이 있지만, SQL은 항상 명시 적입니다.

    나는 자동으로 암시 적으로 모든 외부 키 테이블을 조인 SQL 언어의 잘 모르는 것 같아요. 나는 코드 생성 및 데이터들을 추론보고 도구를 사전을 본 적이 있지만, SQL은 항상 명시 적입니다.

    즉 모든 명시 적 있습니다 조인, 당신은 SQL에서, 실제로 그렇게 보는 이유입니다.

    존재하는 키를 필요로 할 제약이 없기 때문에 실제로, FK 제약없이 데이터베이스 무결성 문제가 경향이있다. 그래서 가능한 한 많은 제약으로이 할 수있는 가장 좋은 방법은 확실히 - 그것은 무결성을 보호하고 최적화 및 다른 사용자를하는 데 도움이됩니다. 규칙을 깰 때 (어느 경우) 알고있는 가장 좋은 방법과 마찬가지로 중요하다.

    당신이 그 테이블 사이에 외래 키 제약 조건과 일치하지 않는 가입 할 수있는 이유에 관해서는, 무수한 예가있다. 특히 일부 조인 복합 키의 경우는이 종종 필요 찾을 수 있습니다. 우리는 종종 데이터웨어 하우징에서의 기본 키의 일부 버전을 사용하여 테이블에 가입 할 수 있습니다.

    또한 외래 키에이 문서에 관심이 옵티 마이저에 의해 제거에 가입 할 수있다.

  17. ==============================

    17.외래 키가 결합된다. 프로그램에서 커플 링은 거의 좋다.

    외래 키가 결합된다. 프로그램에서 커플 링은 거의 좋다.

  18. from https://stackoverflow.com/questions/1876013/why-are-foreign-keys-more-used-in-theory-than-in-practice by cc-by-sa and MIT license