【问题标题】:Relations in ER diagramER图中的关系
【发布时间】:2016-04-07 14:12:56
【问题描述】:

我正在尝试为一家软件开发公司创建一个数据库(作为一个空闲时间项目)

我已经为此苦苦挣扎了一段时间,是时候向你们寻求帮助了。

我有 3 个实体,PROGRAMMER、PROGRAM 和 PLATFORM。一个程序员可以在很多平台上工作,一个程序可以在很多平台上工作,一个程序员可以在很多程序上工作。但是对于特定程序,程序员只能使用一个平台。所以我创建了另一个名为 WORKS 的表,它具有以下属性:Programmer_ID、Program_ID 和 Platform_ID。前两个是主键,因此它符合上述规范。

现在,问题开始了:程序员可以监督程序(这不是强制性的)。监督团队开会,数据库必须存储每个程序的 team_ID 和会议的 DATE,还有一个 Meeting_ID,但这无关紧要。

所以,我必须创建一个不允许在 Programmer_ID - Program_ID 对上重复的表,这样同一个人就不会再次出现在同一组中,而且它必须有一个 Team_ID 女巫将是相同的编号作为 Program_ID,它必须将 Team_ID 引用到 MEETING 表,以便我可以存储它。我怎么能做这样的事情?

感谢您的宝贵时间。

PS:这是我的 ER 的样子:ER Diagram

这是在 MS SQL 2012 中导出的 DLL:

CREATE
  TABLE CUSTOMER
  (
    Customer_ID NUMERIC (5) NOT NULL ,
    Name        CHAR (30) NOT NULL ,
    PR_Guy      CHAR (30) NOT NULL ,
    Phone       CHAR (20) NOT NULL
  )
  ON "default"
GO
ALTER TABLE CUSTOMER ADD CONSTRAINT CUSTOMER_PK PRIMARY KEY CLUSTERED (
Customer_ID)
WITH
  (
    ALLOW_PAGE_LOCKS = ON ,
    ALLOW_ROW_LOCKS  = ON
  )
  ON "default"
GO

CREATE
  TABLE KNOWS
  (
    Programmer_ID NUMERIC (5) NOT NULL ,
    Prog_Lang_ID  NUMERIC (3) NOT NULL
  )
  ON "default"
GO
ALTER TABLE KNOWS ADD CONSTRAINT KNOWS_PK PRIMARY KEY CLUSTERED (Programmer_ID,
Prog_Lang_ID)
WITH
  (
    ALLOW_PAGE_LOCKS = ON ,
    ALLOW_ROW_LOCKS  = ON
  )
  ON "default"
GO

CREATE
  TABLE MEETING_DATE
  (
    Meeting_ID    NUMERIC (3) NOT NULL ,
                  DATE DATE ,
    Program_ID    NUMERIC (5) ,
    Programmer_ID NUMERIC (5)
  )
  ON "default"
GO
ALTER TABLE MEETING_DATE ADD CONSTRAINT MEETING_DATE_PK PRIMARY KEY CLUSTERED (
Meeting_ID)
WITH
  (
    ALLOW_PAGE_LOCKS = ON ,
    ALLOW_ROW_LOCKS  = ON
  )
  ON "default"
GO

CREATE
  TABLE PLATFORM
  (
    Platform_ID   NUMERIC (5) NOT NULL ,
    Name          CHAR (30) NOT NULL ,
    OS            CHAR (30) ,
    Latest_Update DATE NOT NULL ,
    Dev_Name      CHAR (30) NOT NULL
  )
  ON "default"
GO
ALTER TABLE PLATFORM ADD CONSTRAINT PLATFORM_PK PRIMARY KEY CLUSTERED (
Platform_ID)
WITH
  (
    ALLOW_PAGE_LOCKS = ON ,
    ALLOW_ROW_LOCKS  = ON
  )
  ON "default"
GO

CREATE
  TABLE PROGRAM
  (
    Program_ID  NUMERIC (5) NOT NULL ,
    Name        CHAR (30) NOT NULL ,
    Deadline    DATE NOT NULL ,
    Customer_ID NUMERIC (5) NOT NULL
  )
  ON "default"
GO
ALTER TABLE PROGRAM ADD CONSTRAINT PROGRAM_PK PRIMARY KEY CLUSTERED (Program_ID
)
WITH
  (
    ALLOW_PAGE_LOCKS = ON ,
    ALLOW_ROW_LOCKS  = ON
  )
  ON "default"
GO

CREATE
  TABLE PROGRAMMER
  (
    Programmer_ID NUMERIC (5) NOT NULL ,
    First_Name    CHAR (30) NOT NULL ,
    Last_Name     CHAR (30) NOT NULL ,
    Money_Status  NUMERIC (1) NOT NULL
  )
  ON "default"
GO
ALTER TABLE PROGRAMMER ADD CONSTRAINT PROGRAMMER_PK PRIMARY KEY CLUSTERED (
Programmer_ID)
WITH
  (
    ALLOW_PAGE_LOCKS = ON ,
    ALLOW_ROW_LOCKS  = ON
  )
  ON "default"
GO

CREATE
  TABLE PROG_LANG
  (
    Prog_Lang_ID NUMERIC (3) NOT NULL ,
    Name         CHAR (30) NOT NULL
  )
  ON "default"
GO
ALTER TABLE PROG_LANG ADD CONSTRAINT PROG_LANG_PK PRIMARY KEY CLUSTERED (
Prog_Lang_ID)
WITH
  (
    ALLOW_PAGE_LOCKS = ON ,
    ALLOW_ROW_LOCKS  = ON
  )
  ON "default"
GO

CREATE
  TABLE SUPERVISE
  (
    Programmer_ID NUMERIC (5) NOT NULL ,
    Program_ID    NUMERIC (5) NOT NULL ,
    Group_ID      NUMERIC (5) NOT NULL
  )
  ON "default"
GO
ALTER TABLE SUPERVISE ADD CONSTRAINT SUPERVISE_PK PRIMARY KEY CLUSTERED (
Program_ID, Programmer_ID)
WITH
  (
    ALLOW_PAGE_LOCKS = ON ,
    ALLOW_ROW_LOCKS  = ON
  )
  ON "default"
GO

CREATE
  TABLE WORKS
  (
    Programmer_ID NUMERIC (5) NOT NULL ,
    Program_ID    NUMERIC (5) NOT NULL ,
    Platform_ID   NUMERIC (5) NOT NULL
  )
  ON "default"
GO
ALTER TABLE WORKS ADD CONSTRAINT WORKS_PK PRIMARY KEY CLUSTERED (Programmer_ID,
Program_ID)
WITH
  (
    ALLOW_PAGE_LOCKS = ON ,
    ALLOW_ROW_LOCKS  = ON
  )
  ON "default"
GO

ALTER TABLE KNOWS
ADD CONSTRAINT FK_ASS_2 FOREIGN KEY
(
Programmer_ID
)
REFERENCES PROGRAMMER
(
Programmer_ID
)
ON
DELETE
  NO ACTION ON
UPDATE NO ACTION
GO

ALTER TABLE KNOWS
ADD CONSTRAINT FK_ASS_3 FOREIGN KEY
(
Prog_Lang_ID
)
REFERENCES PROG_LANG
(
Prog_Lang_ID
)
ON
DELETE
  NO ACTION ON
UPDATE NO ACTION
GO

ALTER TABLE MEETING_DATE
ADD CONSTRAINT MEETING_DATE_SUPERVISE_FK FOREIGN KEY
(
Program_ID,
Programmer_ID
)
REFERENCES SUPERVISE
(
Program_ID ,
Programmer_ID
)
ON
DELETE
  NO ACTION ON
UPDATE NO ACTION
GO

ALTER TABLE PROGRAM
ADD CONSTRAINT PROGRAM_CUSTOMER_FK FOREIGN KEY
(
Customer_ID
)
REFERENCES CUSTOMER
(
Customer_ID
)
ON
DELETE
  NO ACTION ON
UPDATE NO ACTION
GO

ALTER TABLE SUPERVISE
ADD CONSTRAINT SUPERVISE_WORKS_FK FOREIGN KEY
(
Programmer_ID,
Program_ID
)
REFERENCES WORKS
(
Programmer_ID ,
Program_ID
)
ON
DELETE
  NO ACTION ON
UPDATE NO ACTION
GO

ALTER TABLE WORKS
ADD CONSTRAINT WORKS_PLATFORM_FK FOREIGN KEY
(
Platform_ID
)
REFERENCES PLATFORM
(
Platform_ID
)
ON
DELETE
  NO ACTION ON
UPDATE NO ACTION
GO

ALTER TABLE WORKS
ADD CONSTRAINT WORKS_PROGRAMMER_FK FOREIGN KEY
(
Programmer_ID
)
REFERENCES PROGRAMMER
(
Programmer_ID
)
ON
DELETE
  NO ACTION ON
UPDATE NO ACTION
GO

ALTER TABLE WORKS
ADD CONSTRAINT WORKS_PROGRAM_FK FOREIGN KEY
(
Program_ID
)
REFERENCES PROGRAM
(
Program_ID
)
ON
DELETE
  NO ACTION ON
UPDATE NO ACTION
GO

【问题讨论】:

    标签: sql entity-relationship er-diagrams er-diagram


    【解决方案1】:

    由于有要显示的图像,因此无法将其放在评论中。

    如果您的 WORKS 表的主键包含所有 3 个,即 PROGRAMMER_ID、PROGRAM_ID 和 PLATFORM_ID,那么 MEETING 表可以是 WORKS 表的子表,我认为这可以解决您的问题。

    见下图

    【讨论】:

    • Works 的主键是 Programmer_ID 和 Program_ID。不是 Platform_ID。关键是不能让同一个程序员在多个平台上处理同一个程序。我最终想要的是一个包含 Team_ID、Programmer_ID 和 Program_ID 的表。 Team_ID 不是唯一的,而其他两个是唯一的。
    • 即使尚未建立会议,也必须创建团队。
    • 因此,在这种情况下,您从 PK 中删除 PLATFORM_ID for WORKS,并根据在 MEETING 表中称为 TEAM_ID 的 PROGRAM_ID 从 PROGRAM 到 MEETING 建立另一个 1-N 关系..
    • 有人不明白,不是我就是你。可悲的是,我是 SQL 世界的新手。基本上我需要的是一张桌子。所以第一个条目将是组成第一个团队的所有程序员,第二个是组成第二个团队的所有程序员,依此类推。有这种事吗?
    • k.. 在这里再试一次。. 每个项目都需要一个 TEAM 表,每个项目只能有一个团队,但是这个团队中有很多 PROGRAMMER.. 有一个 PROGRAMMER主管,这是一个公平的评估吗?
    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多