mySQL:形成部分、脱节的层次结构

问题描述 投票:0回答:1

我正在尝试在我正在处理的数据库中创建一个层次结构。在我的特定示例中,我正在跟踪联盟成员是教练还是球员。我了解层次结构背后的想法及其工作原理,但尚未编写层次结构(我们从绘制 ERD 开始,无需编码)。现在我不确定我是否试图使问题变得过于复杂,或者只是不明白我需要如何将 ERD 中的内容转换为我的代码。

我的 ERD 中处理这个问题的部分是这样的:

ERD with hierarchy

我目前拥有的代码是这样的:

CREATE TABLE MEMBER_BK(
    ID_BK INT PRIMARY KEY,
    FIRST_NAME_BK VARCHAR(17) NOT NULL,
    MIDDLE_NAME_BK VARCHAR(17),
    LAST_NAME_BK VARCHAR(17) NOT NULL,
    POSITION_BK CHAR(1) NOT NULL, # <P, C>, P = Player, C = Coach
    CHECK(POSITION_BK = 'P' OR 'C')
    );

CREATE TABLE PLAYER_BK(
    MEMBER_ID_BK INT,
    MEMBER_POSITION_BK CHAR(1),
    JERSEY_NUMBER_BK INT NOT NULL,
    PHONE_BK CHAR(14) NOT NULL,
    PRIMARY KEY(MEMBER_ID_BK, MEMBER_POSITION_BK),
    FOREIGN KEY(MEMBER_ID_BK) REFERENCES MEMBER_BK(ID_BK),
    #FOREIGN KEY(MEMBER_POSITION_BK) REFERENCES MEMBER_BK(POSITION_BK),
    CHECK(MEMBER_POSITION_BK = 'P')
    );

CREATE TABLE COACH_BK(
    MEMBER_ID_BK INT,
    MEMBER_POSITION_BK CHAR(1),
    START_YEAR_BK YEAR NOT NULL,
    EMAIL_BK VARCHAR(22) NOT NULL,
    PRIMARY KEY(MEMBER_ID_BK, MEMBER_POSITION_BK),
    FOREIGN KEY(MEMBER_ID_BK) REFERENCES MEMBER_BK(ID_BK),
    #FOREIGN KEY(MEMBER_POSITION_BK) REFERENCES MEMBER_BK(POSITION_BK),
    CHECK(MEMBER_POSITION_BK = 'C')
    );

目前,当我未注释掉 MEMBER_POSITION_BK 的 FK 时,我收到 1822 错误代码,这导致我倾向于使这个问题过于复杂化。删除 MEMBER_ID_BK 作为 FK 的分配运行时不会发生错误。在寻找答案的过程中,我确实发现我可能需要涉及索引,但这还不是我遇到的问题。

mysql mysql-workbench hierarchy
1个回答
0
投票

您可以使用 ID_BK 和 POSITION_BK 的组合键并将其用作参考:

在 id_bk 上添加唯一的 Key,将不允许成员拥有 C 和 P,但我认为在现实生活中,一个成员可以同时拥有这两个位置。

CREATE TABLE MEMBER_BK(
    ID_BK INT ,
    FIRST_NAME_BK VARCHAR(17) NOT NULL,
    MIDDLE_NAME_BK VARCHAR(17),
    LAST_NAME_BK VARCHAR(17) NOT NULL,
    POSITION_BK CHAR(1) NOT NULL, # <P, C>, P = Player, C = Coach
    CHECK(POSITION_BK = 'P' OR 'C')
  ,UNIQUE (ID_BK)
,  PRIMARY KEY (ID_BK, POSITION_BK)
    );


CREATE TABLE PLAYER_BK(
    MEMBER_ID_BK INT,
    MEMBER_POSITION_BK CHAR(1),
    JERSEY_NUMBER_BK INT NOT NULL,
    PHONE_BK CHAR(14) NOT NULL,
    PRIMARY KEY(MEMBER_ID_BK, MEMBER_POSITION_BK),
    FOREIGN KEY(MEMBER_ID_BK,MEMBER_POSITION_BK) REFERENCES MEMBER_BK(ID_BK,POSITION_BK ),
    CHECK(MEMBER_POSITION_BK = 'P')
    );


CREATE TABLE COACH_BK(
    MEMBER_ID_BK INT,
    MEMBER_POSITION_BK CHAR(1),
    START_YEAR_BK YEAR NOT NULL,
    EMAIL_BK VARCHAR(22) NOT NULL,
    PRIMARY KEY(MEMBER_ID_BK, MEMBER_POSITION_BK),
     FOREIGN KEY(MEMBER_ID_BK,MEMBER_POSITION_BK) REFERENCES MEMBER_BK(ID_BK,POSITION_BK ),
    CHECK(MEMBER_POSITION_BK = 'C')
    );

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.