数据库设计精要:完整性和范式理论

发布于:2025-07-09 ⋅ 阅读:(26) ⋅ 点赞:(0)

数据的完整性

实体的完整性

加主键,保证一个表中每一条数据 和其他条目不同。

主键

实体完整性确保表中的每一行都是唯一的,并且具有唯一的标识符(通常是一个主键)。这意味着在表中不能有重复的行,并且主键字段不能包含NULL值。

主键

在SQL中,主键(Primary Key)是一个或多个字段的组合,用于唯一标识数据库表中的每一行记录。其具备以下特点:

  1. 唯一: 主键的值必须是唯一的,不允许有重复的值。
  2. 非空:主键字段不能包含NULL
  3. 主键可以加快查询速度:主键在创建时会自动建立索引,这有助于提高查询速度。

在一个标准,存储数据的时候,逻辑上我们认为一行数据是一个不可拆分的整体,要求(不是语法要求,是约定俗成的数据库使用规范)每一行数据和另一行不要重复,所以我们在上面的创建表的时候,就给了一个id,准备用它来充当“唯一标识”、

主键的定义:SQL语法 primary key

我们可以给表中的某一列设置为主键,

成为主键之后有两个特点:(1)不允许为null,(2)不允许在表中重复

CREATE TABLE `test`(
	`id` int  primary key,
    `name` varchar(255),
    `gender` char(1)
);

-- 或者

CREATE TABLE `test`(
	`id` int,
    `name` varchar(255),
    `gender` char(1)primary key(id)
);

-- 如果一个表表在创建的时候没有主键,增加主键的sql  -- 使用上:没有任何意义,
-- alter table 表名 add primary key(主键列);
alter table user add primary key (id);

-- 联合主键:复合主键(不建议)。这意味着id和name的组合在table_primary3表中表示主键。
CREATE TABLE table_primary3(
	id INT(11),
    name VERCHAR(25),
    job VERCHAR(25),
    salary FLOAT,
    PRIMARY KEY(id, name)
);
insert into test values(1, 'zl', '男');	-- 如果有id 1,就会插入报错。

如果要解决正确的步骤就是先查表,看哪个id没有使用,然后插入的时候再插入

-- 使用sql语句解决

-- 在创建表时
CREATE TABLE `test`(
	`id` int  primary key AUTO_INCREMENT,
    `name` varchar(255),
    `gender` char(1)
);

-- 插入
-- 服务器接收sql语句,插入NULL对应id,发现id为主键,然后看是否自增,如果不是自增就会报错,有自增会选取一个自增值
insert into test values(null, 'zl', '男');

域完整性

设计某些列,类型要合适,范围要合适

储存数据的时候,存储的内容要符合列的类型的设置

参照完整性

在关系型数据库中,一个表的数据可能依赖于另一个表的数据而存在,或者说两个表的数据存在关联,所以我们希望这种关联/参照,具有一致性(要修改的是同步进行变化)。

外键只是保证参照完整性的一种方式

外键

强制绑定两个具有参照的表的字段。

也就是将一个表的外键绑定为另一个表的主键

在对一个表中的键进行修改时,可能会另一个关联表中进行全局扫描,因为要查看在另一个表中是否在使用。并且主键的扫描次数会少,性能高一点,但是外键的查找性能会低很多。

(修改主键值时,数据库需要检查所有关联的外键约束。如果外键列没有索引,会导致全表扫描,性能较差;而主键由于自带唯一索引,查找效率较高。因此,在设计数据库时,应避免频繁修改主键,并为外键创建索引以提高查询性能)

外键是 MySQL 中用于建立和加强两个表数据之间链接的一种约束。下面我来介绍它的使用方法:

创建外键

在创建表时,可以通过以下方式定义外键:

CREATE TABLE 表名(
    字段1 数据类型,
    字段2 数据类型,
    ...
    [CONSTRAINT 外键约束名] FOREIGN KEY (外键字段名) REFERENCES 主表名(主键字段名)
);

举个例子:

CREATE TABLE department (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

CREATE TABLE employee (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES department(id)
);

删除外键

可以使用 ALTER TABLE 语句来删除外键约束:

ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;

要留意的是,外键约束名可以通过查看表结构获取,也能在创建外键时自行定义。

外键约束选项

在外键定义中,还能够添加 ON UPDATE 和 ON DELETE 子句,以此来定义当主表中的记录被更新或者删除时,从表应该执行的操作。常见的选项如下:

  • ON DELETE CASCADE:主表记录删除时,从表相关记录自动删除。
  • ON UPDATE CASCADE:主表记录更新时,从表相关记录自动更新。
  • ON DELETE SET NULL:主表记录删除时,从表相关字段设为 NULL(要求该字段允许 NULL 值)。
  • ON UPDATE SET NULL:主表记录更新时,从表相关字段设为 NULL。

示例如下:

CREATE TABLE employee (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES department(id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

使用外键的注意事项

  1. 主表和从表的字段数据类型要保持一致。
  2. 主表的字段必须是主键或者具有唯一约束。
  3. InnoDB 存储引擎才支持外键,MyISAM 不支持。
  4. 外键会对数据的插入、更新和删除操作产生影响,可能会导致性能下降。
  5. 要避免出现循环外键约束,不然会造成死锁的情况。

多表设计/多表理论

一对一和一对多

一对一的表很少见,因为在理论上可以合并为一张表。

多对多

多对多的两张表一般需要一个中间对照表来连接两个表之间的关系。

依靠中间表,来将多对多的两张表,进行连接,对应下面就是:学生信息与对照表是一对多的关系,剧本表与对照表是一对多的关系,学生信息表与剧本表是多对多的关系。

数据库的设计范式

第一范式:原子性

第二范式:唯一性

不存在部分依赖(不能是组合唯一,就是使用联合主键)必须为某一列作为主键设置唯一。

第三范式:不冗余性


网站公告

今日签到

点亮在社区的每一天
去签到