SQL——关系模型

1. 主键

主键是关系表中记录的唯一标识。
主键的选取:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL

idclass_idnameother columns…
11小明
21小红
52小白

2. 外键

students表中,通过class_id的字段,可以把数据与另一张表关联起来,这种列称为外键

外键并不是通过列名实现的,而是通过定义外键约束实现的:

ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);

其中,外键约束的名称fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键)。

通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes表不存在id=99的记录,students表就无法插入class_id=99的记录。

由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,只是它起到了外键的作用而已。

要删除一个外键约束,也是通过ALTER TABLE实现的:

ALTER TABLE students
DROP FOREIGN KEY fk_class_id;

注意:删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN ...实现的。

3. 索引

经常根据score列进行查询,就可以对score列创建索引:

ALTER TABLE students
ADD INDEX idx_score (score);

使用ADD INDEX idx_score (score)就创建了一个名称为idx_score,使用列score的索引。索引名称是任意的,索引如果有多列,可以在括号里依次写上,例如:

ALTER TABLE students
ADD INDEX idx_name_score (name, score);
3.1 唯一索引

在设计关系数据表的时候,看上去唯一的列,例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。

但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,我们假设students表的name不能重复:

ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);

通过UNIQUE关键字我们就添加了一个唯一索引。

也可以只对某一列添加一个唯一约束而不创建唯一索引:

ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);

这种情况下,name列没有索引,但仍然具有唯一性保证。

无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。这里的意思是说,当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,如果没有索引,查询也能正常执行,只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化。

### SQL Server 的关系模型 #### 关系模型概述 SQL Server 使用关系模型来组织和存储数据。在这个模型中,数据以表(Tables)的形式进行管理,每个表包含行(Rows)和列(Columns),其中每一行代表一条记录,而每列表示一个属性[^2]。 #### 表的设计原则 为了确保高效的数据管理和访问,在设计表时应遵循一定的原则: - **实体唯一性**:通过定义主键来保证每个实体的唯一性。主键由一个或多个字段组成,不允许为空值(NULL),并且在一个表内具有唯一性。 - **外键关联**:利用外键实现不同表之间的一致性和参照完整性。外键是一组用于建立并强化两个表间连接的一个或多个列,它通常是另一张表中的主键值的一部分。 #### E-R 图转关系模型实例 对于餐饮点菜系统的E-R图转换成关系数据模型的过程涉及以下几个方面: 1. **概念结构到逻辑结构的转化** - 首先将E-R图中的实体集映射为关系模式; - 定义各实体对应的表格以及它们之间的联系方式; 2. **具体DBMS的支持调整** - 根据SQL Server的特点进一步细化设计方案,比如选择合适的数据类型、设置索引等操作; 3. **优化阶段** - 对初步形成的关系模型进行审查和完善,提高性能的同时保持良好的可维护性[^1]。 ```sql CREATE TABLE Customers ( CustomerID INT PRIMARY KEY, Name NVARCHAR(50), Phone VARCHAR(20) ); CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT FOREIGN KEY REFERENCES Customers(CustomerID), OrderDate DATETIME ); ``` 上述代码展示了如何基于客户订单场景创建两张相互关联的基础表——`Customers` 和 `Orders`。这里使用了主键 (`CustomerID`) 来标识唯一的顾客,并在外键约束下建立了两者间的联系[^4]。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子象限

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值