4

我正在为我的大学创建一个 Delphi 应用程序,但现在我陷入了困境。该程序是关于数据库的,我使用 FireBird 2.1 作为数据库服务器。我的数据库和应用程序是关于 Linux 发行版的。

我正在尝试链接我的 Firebird 数据库中的两个表。第一个表提供有关分发的信息,第二个表提供有关桌面环境的信息。我要链接两个字段:分布表中的默认桌面环境和 DEs 表中的桌面环境名称。

一个发行版只能有一个默认桌面环境,即安装光盘上的(或用户在安装过程中选择的)。在 DEs 表中,有一个唯一字段,描述了 DE 的名称,因此它应该链接到 Distributions 的 Default 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 字段),而 DEs 表应该有外键(ENV_NAME 字段,与分布表的 DE 字段链接)。

但我不能这样做,因为 SQL 要求分布表的 DE 字段作为主键。并且主键必须是唯一的。但是,一个桌面环境可以被许多 Linux 发行版使用,所以这个字段不可能是唯一的。而且我只是不知道如何正确链接这两个表。

4

2 回答 2

4

正如您所描述的,发行版具有默认的桌面环境。这意味着从DISTROSto的外键DES,但是相反,您可以反过来建模外键。外键的目的地需要PRIMARY KEYor UNIQUE CONSTRAINT,因此您当前的解决方案存在问题。

DES解决方案是从to中删除外键DISTROS并将其替换为:

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

我建议重新研究 SQL 和关系建模,因为这些是您在使用 SQL 和(关系)数据库时真正需要了解的基础知识。

此外,我知道 Firebird 中标识符的 31 个字符限制可能是个问题,但您应该尝试使用更长的描述性名称(尤其是DESDE)。

于 2013-02-14T12:26:26.850 回答
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 表中添加一个自动递增(或身份)ID 字段以用作 PK。

于 2013-02-14T00:41:41.527 回答