概念
在数据建模中,键(Key)指代一种属性或属性组合,用于唯一标识一张表中的每个记录。每个关系型数据库表都必须有一个唯一的键来确保记录的唯一性和查询的正确性。总的来说有以下几个优点:
- 确保唯一性:每个表的键确保表中的每个记录都是唯一的。这样就可以避免由于重复记录引起的数据不一致性和查询错误。
- 高效查询:键可以用作查询引擎的优化条件,以提高查询的性能。
- 数据完整性:主键和外键可以帮助维护数据完整性,确保表之间关系的正确性。外键可以确保每个引用另一个表的记录都存在,而主键则确保表中没有重复记录。
- 连接表:外键可以用于连接多个表,以构建关系,同时保证数据的一致性。
种类
键类型 | 描述 | 示例 |
---|---|---|
候选键 | 表中可以唯一标识一个记录的一组属性,不包含任何冗余信息 | 商品编号、订单号等 |
主键 | 被选定作为一个表中主要标识的唯一一组属性,每个记录必须唯一 | 用户ID、员工号等 |
外键 | 链接在一个表中的一组属性到另一个表的主键,用于表之前的关系建立 | 订单表中的商品编号,链接到商品表的商品编号 |
超键 | 能唯一标识表中一行数据的所有属性。超键可能包含冗余数据 | 用户ID和邮箱,即使只用一个属性也可以唯一标识一条记录 |
复合键 | 将多个属性组成的键。属性的组合在表中必须是唯一的 | 联合主键、多列组成复合键 |
自然键 | 使用业务上已存在的属性作为主键 | 身份证号、邮箱等 |
代理键 | 使用一个没有任何现实意义,可自动生成的、不可变的唯一标识符作为主键 | 自增ID、UUID等 |
序列键 | 在数据库中生成唯一的键,采用的是递增或递减的方式 | Postgres序列、Oracle序列等 |
以上表格仅供参考,实际数据库设计中还有其他类型的键,这取决于不同的场景和需求。
举个例子
主键的创建
Copy codeCREATE TABLE customers (
customer_id INT PRIMARY KEY,
first_name VARCHAR(25),
last_name VARCHAR(25),
email VARCHAR(50)
);
以上 SQL 代码创建了一个名为 customers
的表,其中 customer_id
属性被定义为主键。
外键的创建
Copy codeCREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
以上 SQL 代码创建了一个名为orders
的表,其中customer_id
属性是一个外键,引用了 customers
表中的 customer_id
属性。
复合键的创建
Copy codeCREATE TABLE user_roles (
user_id INT,
role_id INT,
PRIMARY KEY (user_id, role_id)
);
以上 SQL 代码创建了一个名为 user_roles
的表,其中 user_id 和 role_id
属性共同组成了复合主键。
自增主键的创建
Copy codeCREATE TABLE employees (
employee_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(25),
last_name VARCHAR(25),
hire_date DATE
);
以上 SQL 代码创建了一个名为employees
的表,其中employee_id
属性被定义为自增主键。每次插入新数据时,数据库会自动生成一个唯一的 employee_id
值。
序列键的创建
Copy codeCREATE TABLE products (
product_id INT PRIMARY KEY,
item_name VARCHAR(50),
price DECIMAL(10, 2),
quantity INT,
product_code VARCHAR(10) DEFAULT concat('P', lpad(nextval('product_seq'), 5, '0'))
);
CREATE SEQUENCE product_seq;
以上 SQL 代码创建了一个名为products
的表,其中product_id
属性是一个整数类型的主键,同时创建了一个名为product_seq
的序列,用于自动生成product_code
值。