4

大学用のDelphiアプリケーションを作成していますが、行き詰まっています。プログラムはデータベースに関するもので、私はFireBird2.1をデータベースサーバーとして使用しています。私のデータベースとアプリケーションはLinuxディストリビューションに関するものです。

Firebirdデータベースの2つのテーブルをリンクしようとしています。最初の表はディストリビューションに関する情報を提供し、2番目の表はデスクトップ環境に関する情報を提供します。リンクしたい2つのフィールドがあります。DistributionsテーブルのDefaultDesktopEnvironmentとDEsテーブルのDesktopEnvironmentNameです。

1つのディストリビューションには、インストールディスクにある(またはインストール中にユーザーが選択した)デフォルトのデスクトップ環境を1つだけ含めることができます。DEsテーブルには、DEの名前で記述された一意のフィールドがあるため、ディストリビューションのデフォルトのDEフィールドにリンクする必要があります。

ただし、1つのDEを複数のディストリビューションでデフォルトのDEとして使用できます。これは、競合が発生する場所です。distrosテーブルのデフォルトのDEフィールドは一意である必要がありますが、そうではありません。私が到達しようとしているのは、参照整合性です。DEテーブルを依存させます。

また、DISTR_NAMEフィールドとENV_NAMEフィールドのみで構成される3番目のテーブルを作成しようとしましたが、これで到達した唯一のことは、この3番目のテーブルをDISTROSテーブルとDESテーブルに依存させることですが、それは間違っています。DESテーブルはDISTROSテーブルに依存している必要がありますが、その方法がわかりません。だからどんな助けもいただければ幸いです!これらの2つのテーブルを正しくリンクするにはどうすればよいですか?

そこで、次の2つのテーブルを作成しました。

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フィールドが主キーである必要があるため、これはできません。また、主キーは一意である必要があります。ただし、1つのデスクトップ環境を多くのLinuxディストリビューションで使用できるため、このフィールドを一意にすることはできません。そして、これら2つのテーブルを正しくリンクする方法がわかりません。

4

2 に答える 2

4

As you describe it, a distribution has a default desktop environment. This implies a foreign key from DISTROS to DES, but instead you model a foreign key the other way around. The destination of a foreign key requires a PRIMARY KEY or UNIQUE CONSTRAINT, hence the problem with your current solution.

The solution is to remove the foreign key from DES to DISTROS and replace it with:

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

I would advise to re-study SQL and relational modelling, because these are the basics that you really need to know when working with SQL and (relational) databases.

Also, I know the 31 character limit for identifiers in Firebird can be a problem, but you should really try to use longer, descriptive, names (especially for DES and DE).

于 2013-02-14T12:26:26.850 に答える
2

What you are describing sounds like a Many-to-Many relationship. Also it sounds like you almost are there on your own. There is always a 3rd table in M2M relationsihps as you described. Your final structure would look something like this.

**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

One more bit of advice. You really don't want primary key values that are likely to change frequently, and consequently varchar fields are often a poor choice. I'd suggest adding an Auto-Incrementing (or identity) ID field to the DES and DISTROS tables for use as a PK.

于 2013-02-14T00:41:41.527 に答える