首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有唯一键的ER关系

具有唯一键的ER关系
EN

Database Administration用户
提问于 2013-10-05 11:40:14
回答 1查看 6.5K关注 0票数 2

我的ER图有点问题。假设我想与学生、成员和团队绘制一个图表。这是我的规格:

  1. 学生不必是任何团队的一员。
  2. 一个学生最多可以是一个团队的成员。
  3. member有一个唯一的成员ID。

我做了ER图:

代码语言:javascript
运行
复制
                                                  member-id (key attribute)
                                                            |
--------                          -                    -----------
- team -------------------- -  - mem -   ------------- - student -
--------                          -                    -----------

正如我之前说过的,学生不必成为任何团队的一员。在这种情况下,我的图表工作正常吗?我问它是因为member_id是一个独特的密钥。

EN

回答 1

Database Administration用户

发布于 2013-10-05 12:11:52

目前,我在您的模型中看到了两个可能的问题:

  1. 团队的Member可以在不引用Student的情况下存在。1.1。如果在Member中删除一个带有ON DELETE CASCADE外键的Student选项,它将删除您的学生。1.2。如果删除一个Student,可能会有一个没有引用任何StudentMember
  2. 如果您想将Member属性放置到Student表中,那么每次都必须将它们设置为NULL,然后需要取消引用StudentMember。同时,它也会导致表Student的松散,它的独立性。如果你不这么做,这个问题就永远不会发生。

我可能会建议你这样做:

其中: AI = AUTO_INCREMENT,NN = NOT NULL,UN = UNSIGNED

  1. 学生不能在两个团队中存在,因为对于每个Member记录,表Student中可能只有一条记录。
  2. 如果Member表中的记录存在于Student表记录中,则学生可以成为成员。但是,他可能在Member中没有记录,但在Student表中仍然有记录。意思是他不是任何团队的一员。

如何做到这一点?

  1. Member表的主键设置为外键,引用Student表的主键。PRIMARY KEYs默认为UNIQUE,不能有重复值。因此,Member表中不会有两条记录用于表Student的一条记录。
  2. 为表Member创建一个外键,引用Team表的主键。只有成员才能有一个团队。
  3. 因为每个Student只有一条记录可以放在Member表中,所以每个学生只能在一个团队中。
  4. 如果删除Member记录,则Student关联记录将不再是任何团队的成员,但仍然是学生。

测试脚本(假设MySQL关系数据库管理系统):

代码语言:javascript
运行
复制
DROP SCHEMA IF EXISTS `test`;
CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `test`;

CREATE TABLE IF NOT EXISTS `Team` (
  `IDTeam` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `etc` VARCHAR(45) NULL,
  PRIMARY KEY (`IDTeam`))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `Student` (
  `IDStudent` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`IDStudent`))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `Member` (
  `IDMember` INT UNSIGNED NOT NULL,
  `TeamID` INT UNSIGNED NOT NULL,
  `etc` VARCHAR(45) NULL,

  PRIMARY KEY (`IDMember`),

  INDEX `fk_Member_Team` (`TeamID` ASC),

  CONSTRAINT `fk_Member_Student`
    FOREIGN KEY (`IDMember`)
    REFERENCES `Student` (`IDStudent`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,

  CONSTRAINT `fk_Member_Team`
    FOREIGN KEY (`TeamID`)
    REFERENCES `Team` (`IDTeam`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;
票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/51073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档