2013-02-14 29 views
4

我正在爲我的大學創建一個Delphi應用程序,現在我被卡住了。該程序是關於數據庫的,我使用FireBird 2.1作爲數據庫服務器。我的數據庫和應用程序是關於Linux發行版的。SQL和外鍵:如何正確鏈接這兩個表?

我想鏈接我的Firebird數據庫中的兩個表。第一個表格提供有關分配的信息,第二個表格提供有關桌面環境的信息。有兩個字段我想要鏈接:分佈表中的默認桌面環境和DEs表中的桌面環境名稱。

一個發行版只能有一個默認的桌面環境,它位於安裝光盤上(或者在安裝期間由用戶選擇)。在DE表中,有一個唯一的字段,描述了DE的名稱,所以它應該鏈接到分佈的默認DE字段。

但是,一個DE可以用作默認DE 多個分佈,這是衝突所在:發佈表中的默認DE字段必須是唯一的,但事實並非如此。我試圖達到的是參照完整性:使DEs表依賴。

另外,我試着創建第三個表,它只包含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); 

我無法弄清楚如何解決這個問題:分佈表必須是父表,和DEs表必須是子表。分配表應具有主鍵(DISTR_NAME字段),並且DE表應具有外鍵(ENV_NAME字段,與分配表的DE字段鏈接)。

但我不能那樣做,因爲SQL要求分發表的DE字段是主鍵。主鍵必須是唯一的。但是,一個桌面環境可以被許多Linux發行版使用,所以這個字段不可能是唯一的。而我只是不知道如何正確鏈接這兩個表。

+0

我刪除了Delphi和IBExpert標籤,因爲這個問題與使用的編程語言或數據庫管理軟件完全無關。這完全是一個Firebird SQL問題。 – 2013-02-14 00:45:06

+0

我認爲你的外鍵應該從'DISTROS'到'DES',而不是相反。 – 2013-02-14 09:21:19

+0

Mark Rotteveel,是的!是!非常感謝你!謝謝!它幫助,現在一切正常!謝謝! – ArchAlessus 2013-02-14 10:40:00

回答

4

正如你所描述的,分佈有一個默認的桌面環境。這意味着一個從DISTROSDES的外鍵,但是相反你可以用另一種方式建立一個外鍵。外鍵的目標位置需要PRIMARY KEYUNIQUE CONSTRAINT,因此您的當前解決方案存在問題。

的解決方法是刪除從DES的外鍵DISTROS並將其替換爲:

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

我會建議重新研究SQL和關係模型,因爲這些是你真正需要的基本知識知道何時使用SQL和(關係數據庫)。另外,我知道火鳥標識符的31個字符限制可能是一個問題,但您應該嘗試使用更長的描述性名稱(特別是DESDE)。

+0

再次感謝。我對SQL的知識很糟糕,但那是因爲我3年前纔在大學裏學過,而不是我自己。我需要這些知識的唯一事情就是我剛剛完成的這項工作。將來,如果看起來我需要知道SQL來做某件事,我會遵從你的建議並重新研究它,但現在我不需要它了。 – ArchAlessus 2013-02-14 13:07:16

2

您所描述的內容聽起來像是多對多關係。這聽起來像你幾乎是在你自己的。正如你所描述的那樣,M2M關係總是有第三張表。你的最終結構看起來像這樣。

**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字段往往是一個糟糕的選擇。我建議在DES和DISTROS表中添加一個Auto-Incrementing(或identity)ID字段用作PK。

+0

看來我必須更具體。事實上,爲了簡化我的工作,我將這個DE字段設置爲「Default DE」字段。例如,OpenSUSE中的默認DE是KDE等等。所以它更像一對多。還有一個問題:DES表應該依賴於分佈表,但是如果我使用這種結構(正如我前面提到的,我已經有了類似的表),DE表不依賴於DISTROS_TO_DES表,但它依賴於它反之亦然。我不知道該怎麼做... – ArchAlessus 2013-02-14 00:56:31

+0

我建議編輯你的問題要更清楚。要完成你的實際問題非常困難。用英語解釋你想做的事情,而不是試圖把它翻譯成你的表格結構。 – JohnFx 2013-02-14 00:57:20

+0

編輯您的問題,而不是評論... – JohnFx 2013-02-14 02:09:58