### 数据库知识点解析 #### 一、E-R图与关系模式转换 **题目背景:** 一个工厂管理系统包含以下几个实体:厂、工人、零件。每个实体都有特定的属性,并且实体之间存在一定的联系。 **实体及属性:** 1. **厂** - 单位号、名称、电话、地址 2. **工人** - 工人编号、姓名、年龄、性别、工资、岗位津贴 3. **零件** - 零件号、名称、规格、价格 **联系及约定:** 1. **一个厂可以生产多种零件**,同一种零件可以被不同的厂生产; 2. **一个厂有多名工人**,而一个工人只能属于一个厂。 **E-R图绘制说明:** 1. **实体** - 使用矩形表示,分别标记为“厂”、“工人”、“零件”; 2. **属性** - 使用椭圆形表示,连接到对应的实体框; 3. **联系** - 使用菱形表示,分别为“生产”和“属于”,并标注联系的类型(多对多或多对一)。 **E-R图具体细节:** - **厂**与**零件**之间的联系为“生产”,是多对多关系,因为一个厂可以生产多种零件,而同一种零件也可以被不同的厂生产。需要引入一个新的实体“生产记录”,其属性包括单位号和零件号。 - **厂**与**工人**之间的联系为“属于”,是一对多关系,因为一个厂有多名工人,但一个工人只能属于一个厂。 **关系模式转换:** 1. **厂** (`单位号`, 名称, 电话, 地址) - 关系键为`单位号` 2. **工人** (`单位号`, 工人编号, 姓名, 年龄, 性别, 工资, 岗位津贴) - 关系键为`单位号`和`工人编号` 3. **零件** (`零件号`, 名称, 规格, 价格) - 关系键为`零件号` 4. **生产记录** (`单位号`, `零件号`) - 关系键为`单位号`和`零件号` #### 二、关系代数运算 **已知关系S和R:** | D | E | F | |---|---|---| | d1 | e1 | f1 | | d2 | e1 | f2 | | D | E | F | |---|---|---| | d1 | e2 | f3 | | d1 | e1 | f1 | | d2 | e1 | f2 | 1. **S ∩ R** (交集) - 取两个关系中相同的元组: | D | E | F | |---|---|---| | d1 | e1 | f1 | | d2 | e1 | f2 | 2. **S ∪ R** (并集) - 合并两个关系的所有元组,去除重复: | D | E | F | |---|---|---| | d1 | e1 | f1 | | d2 | e1 | f2 | | d1 | e2 | f3 | #### 三、SQL与数据库管理 **数据库结构概述:** - **供应商表S** - Sno为主键,Sname唯一,city非空。 - **工程表J** - Jno为主键,Jname唯一非空。 - **零件表P** - Pno为主键,Pname唯一。 - **供应商-零件-工程项目关系表SPJ** - Sno、Pno、Jno组合为主键。 **具体实现:** 1. **创建数据表S**: ```sql CREATE TABLE S ( Sno CHAR(4) PRIMARY KEY, Sname VARCHAR(20) UNIQUE, City VARCHAR(20) NOT NULL ); ``` 2. **创建规则rule1**: ```sql CREATE RULE rule1 AS @X % 100 = 0; EXEC sp_bindrule 'rule1', 'spj.qty'; ``` 3. **查询功能实现**: - 查询‘P1’零件的颜色: - **关系代数**: ```sql π(color)(σ(pno='P1')(P)) ``` - **SQL查询语句**: ```sql SELECT color FROM P WHERE pno = 'P1'; ``` - 查询使用“上海”供应商供应的零件的工程的工程号: - **关系代数**: ```sql π(Jno)(σ(City='上海')(S * SPJ)) ``` - **SQL查询语句**: ```sql SELECT Jno FROM S JOIN SPJ ON S.Sno = SPJ.Sno WHERE City = '上海'; ``` 4. **创建视图VIEW1**: ```sql CREATE VIEW VIEW1 AS SELECT Jno, SUM(QTY) FROM SPJ GROUP BY Jno; ``` 5. **权限管理**: ```sql REVOKE SELECT, UPDATE ON J FROM user1; REVOKE SELECT, UPDATE ON P FROM user1; ``` 6. **创建存储过程**: ```sql CREATE PROCEDURE proc1 (@JNO CHAR(4)) AS BEGIN DECLARE @JNAME NUMERIC(5, 1), @CITY VARCHAR(20); SELECT @JNAME = Jname, @CITY = City FROM J WHERE jno = @JNO; IF @JNAME IS NULL PRINT '找不到数据'; ELSE PRINT @JNAME + ' ' + @CITY; END; ``` 7. **创建触发器**: ```sql CREATE TRIGGER trigger1 ON J FOR INSERT AS IF EXISTS (SELECT * FROM inserted WHERE City = '上海') ROLLBACK; ``` 以上是对给定试题中的知识点进行了详细的解析和说明。这些知识点覆盖了数据库设计的基本要素,如E-R模型、关系代数、SQL查询、视图、存储过程和触发器等,对于初学者来说是非常有价值的练习材料。
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助