2013-02-14 4 views
4

저는 현재 제 대학의 델파이 응용 프로그램을 만들고 있습니다. 이 프로그램은 데이터베이스에 관한 것이며 FireBird 2.1을 데이터베이스 서버로 사용합니다. 데이터베이스와 응용 프로그램은 Linux 배포판에 관한 것입니다.SQL 및 외래 키 :이 두 테이블을 올바르게 연결하는 방법?

내 Firebird 데이터베이스에 두 개의 테이블을 연결하려고합니다. 첫 번째 테이블은 배포판에 대한 정보를 제공하고 두 번째 테이블은 데스크톱 환경에 대한 정보를 제공합니다. 링크하려는 두 필드가 있습니다 : 배포 테이블의 기본 데스크탑 환경과 DE 테이블의 데스크탑 환경 이름.

하나의 배포판에는 설치 디스크에 있거나 설치 중에 사용자가 선택한 기본 데스크톱 환경이 하나만있을 수 있습니다. DE 테이블에는 DE의 이름이 기술 된 고유 한 필드가 있으므로 배포의 기본 DE 필드에 연결되어야합니다.

그러나 하나의 DE는 기본값 배포본으로 사용될 수 있으며 여기에는 충돌이 있습니다. 배포판 테이블의 기본 DE 필드는 고유해야하지만 그렇지 않습니다. 내가 도달하고자하는 것은 참조 무결성입니다. DE 테이블을 종속적으로 만드십시오.

또한 DISTR_NAME 및 ENV_NAME 필드로만 구성된 세 번째 테이블을 만들려고했으나이 세 번째 테이블을 DISTROS 및 DES 테이블에 의존하게 만드는 것이 유일한 방법입니다. 틀렸어. DES 테이블은 DISTROS 테이블에 의존해야하며, 어떻게해야하는지 알지 못합니다. 그래서 어떤 도움을 주시면 감사하겠습니다! 이 두 테이블을 올바르게 연결하는 방법?

그래서 만든이 두 테이블 :

CREATE TABLE DISTROS (
    DISTR_NAME VARCHAR(50) NOT NULL, 
    ARCHITECT VARCHAR(50) NOT NULL, 
    DEFAULT_DE VARCHAR(50) NOT NULL, 
    LASTSTABLE VARCHAR(50) NOT NULL, 
    PACKMANAGE VARCHAR(50) NOT NULL 
); 

CREATE TABLE DES (
    ENV_NAME VARCHAR(50) NOT NULL, 
    USED_LANG VARCHAR(50) NOT NULL, 
    LASTSTABLE VARCHAR(50) NOT NULL, 
    SUPPORT_3D SMALLINT, 
    FILEMANAGE VARCHAR(50) NOT NULL 
); 
ALTER TABLE DES ADD CONSTRAINT PK_DES PRIMARY KEY (ENV_NAME); 
ALTER TABLE DES 
    ADD CONSTRAINT FK_DES_1 FOREIGN KEY (ENV_NAME) REFERENCES DISTROS (DE); 
나는이 문제를 해결하는 방법을 알아낼 수 없습니다

: 분포 테이블이 부모 테이블이어야하며, DE 테이블은 자식 테이블이어야합니다. 분배 테이블에는 기본 키 (DISTR_NAME 필드)가 있어야하며 DE 테이블에는 외부 키 (ENV_NAME 필드, 분배 테이블의 DE 필드와 링크 된)가 있어야합니다.

그러나 SQL은 배포 테이블의 DE 필드를 기본 키로 요구하기 때문에 그렇게 할 수 없습니다. 기본 키는 고유해야합니다. 그러나 하나의 데스크탑 환경은 여러 리눅스 배포판에서 사용할 수 있으므로이 필드는 고유하지 않을 수 있습니다. 그리고이 두 테이블을 올바르게 연결하는 방법을 알 수 없습니다.

+0

이 질문은 사용되는 프로그래밍 언어 또는 데이터베이스 관리 소프트웨어와는 전혀 관련이 없으므로 Delphi 및 IBExpert 태그를 제거했습니다. 이것은 엄격하게 파이어 버드 SQL 질문입니다. –

+0

당신의 외래 키가'DISTROS'에서'DES'까지이어야하고 다른 길은 아닌 것이어야한다고 생각합니다. –

+0

Mark Rotteveel, 예! 예! 정말 고마워요! 고맙습니다! 도움이되었고 이제 모든 것이 제대로 작동합니다! 고맙습니다! – ArchAlessus

답변

4

설명대로, 배포의 기본값은 이고 데스크톱 환경은입니다. 이것은 DISTROS에서 DES까지의 외래 키를 의미하지만 대신에 외래 키를 다른 방법으로 모델링합니다. 외래 키의 대상에 PRIMARY KEY 또는 UNIQUE CONSTRAINT이 필요하므로 현재 솔루션에 문제가 있습니다.이 당신이 정말로 필요로하는 기본이기 때문에, 나는 SQL 관계형 모델링 학습 다시 권합니다

ALTER TABLE DISTROS 
    ADD CONSTRAINT FK_DISTROS_DES FOREIGN KEY (DE) REFERENCES DES (ENV_NAME); 

:

이 솔루션은 DISTROSDES에서 외래 키를 제거하고 그것을 대체하는 것입니다 SQL 및 (관계형) 데이터베이스로 작업 할 때 알아야합니다.

또한, Firebird에서 식별자의 31 자 제한이 문제가 될 수 있지만 실제로는 더 길고 설명이 포함 된 이름을 사용해야합니다 (특히 DESDE).

+0

다시 한번 감사드립니다. SQL에 대한 지식은 끔찍하지만 3 년 전만해도 대학에서 배웠기 때문에 그랬습니다. 그리고 내가이 지식을 필요로하는 유일한 것은 방금 끝낸이 일입니다. 미래에 SQL을 알아야 할 필요가있는 것처럼 보일 경우, 필자는 귀하의 조언을 따르고 재검토 할 것이지만 지금은 필요하지 않습니다. – ArchAlessus

2

당신이 말하는 것은 다 - 대 - 다 관계 같은 것 같습니다. 또한 당신 자신이 거의 거기에있는 것처럼 들립니다. 설명 된대로 항상 M2M relationsihps에 세 번째 테이블이 있습니다. 최종 구조는 다음과 같습니다.

**DISTROS** 
DISTR_NAME - PK/Unique 

**DISTROS_TO_DES** (PK contains both fields which are collectively unique) 
DISTR_NAME FK to Distros.DISTR_NAME 
ENV_NAME FK to DES.ENV_NAME 

**DES** 
ENV_NAME - PK/Unique 

조언이 한 번 더 있습니다. 자주 변경 될 가능성이있는 기본 키 값을 원하지 않으므로 varchar 필드는 종종 좋지 않은 선택입니다. 나는 자동 증분 (또는 ID) ID 필드를 PK로 사용하기 위해 DES 및 DISTROS 테이블에 추가하는 것이 좋습니다.

+0

나는 좀 더 구체적 이어야만합니다. 실제로, 나는이 DE 필드를 "Default DE"필드와 같은 것으로 만든다. 예를 들어, OpenSUSE의 기본 DE는 KDE이다. 그래서 이것은 일대 다 (One-to-Many)와 같습니다. 그리고 문제가 있습니다 : DES 테이블은 배포 테이블에 의존해야합니다. 그러나이 구조를 사용하면 (앞에서 언급했듯이 이미 비슷한 것을 가지고 있습니다), DE 테이블은 종속적이지 않고 DISTROS_TO_DES 테이블은 종속되어 있지만 반대의 경우도 마찬가지입니다. 그리고 나는 이것을하는 법을 모른다 ... – ArchAlessus

+0

나는 당신의 질문을 더 명확하게 편집 할 것을 제안한다. 실제 질문에 도달하는 데 극도로 어려움을 겪습니다. 영어를 당신의 테이블 구조로 번역하려는 대신 영어로 무엇을하려하는지 설명하십시오. – JohnFx

+0

덧글 대신 질문 편집 ... – JohnFx