问题描述
下面是我的建表语句,在其中我并没有使用到外键,去关联三个表,但是我发现三个表中具有隐式的关联关系
create database library;
use library;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` varchar(255) NOT NULL COMMENT '用户名',
`password` varchar(255) NOT NULL COMMENT '密码',
`email` varchar(255) NOT NULL COMMENT '邮箱',
`phone` int(40) NOT NULL COMMENT '手机号',
`age` int(20) NOT NULL COMMENT '年龄',
`sex` varchar(20) NOT NULL COMMENT '性别',
`identity` varchar(20) DEFAULT '普通用户' COMMENT '身份',
PRIMARY KEY (`id`),
UNIQUE KEY `id_username`(`username`) USING BTREE,
UNIQUE KEY `id_password`(`password`) USING BTREE
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book`(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`book_name` varchar(255) NOT NULL COMMENT '图书名字',
`book_author` varchar(255) NOT NULL COMMENT '图书作者',
`book_number` int(20) NOT NULL COMMENT '图书数量',
`book_kind` varchar(255) NOT NULL COMMENT '图书种类',
`book_brief` varchar(255) NOT NULL COMMENT '图书简介',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
DROP TABLE IF EXISTS `user_book`;
CREATE TABLE `user_book`(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` bigint(20) NOT NULL COMMENT '用户id',
`book_id` bigint(20) NOT NULL COMMENT '图书id',
`is_return` varchar(20) NOT NULL COMMENT '是否归还',
`start_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '借阅时间',
`end_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '归还时间',
PRIMARY KEY (`id`),
UNIQUE KEY `id_user` (`user_id`) USING BTREE,
UNIQUE KEY `id_book` (`book_id`) USING BTREE
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE =utf8mb4_general_ci;
视图结果:
原因分析
为什么会有这种效果呢,原来是共享字段之间的隐式关系。
什么是共享字段?
- 字段名一致,如果两个或者多个表中存在具有相同命名的字段,则这些字段可以用于关联
- 数据类型和约束一致性:通过观察观察字段的数据类型和约束,如果两个或者多个表中的字段具有相同的数据类型和约束,可能用于关联的共享字段
- 业务逻辑一致性:根据具体的业务需求和数据模型设计,观察哪些字段在不同的表之间扮演着关联角色。例如,根据图书借阅场景,用户ID和图书ID通常会在关联表中用于关联用户和图书
在示例中,user_book 表中的 user_id 字段和 book_id 字段分别与 user 表和 book 表中的主键 id 相对应。这样,这两个字段就成为了隐含的关联字段,用于建立 user_book 表和父表之间的关系。