不设外键:用程序来实现表之间的关联

img_2876f76a73e7ca18ee9b074196a50485.jpe
Association

相信有很多同学都有使用过Hibernate框架的开发经验,尽管现在开发人员对Hibernate的褒贬不一,我们暂且不谈这个话题。
图中的三个注解,正好解析了表与表之间的关联关系。我也就不这这方面进行过多的赘述了。所以...
今天的主题是:我想在不涉及表与表之间的关联关系的情况下对表进行关联。
换成对应的表的意思就是,不设外键,实现多对多关联。话不多说 先上一张我自己的设计手稿:


img_9bebe716b78970bf19e1a1ee2c74ebb7.jpe
手稿

数据库:(数据库的编码(utf8)与数据库引擎(InnonDB)已经设置好了)

CREATE table t_user(
    uid int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(100) not null,
    password VARCHAR(100) not null,
    createtime date not null
)default CHARSET=utf8;

-- 创建角色表
CREATE TABLE t_role(
    rid int(10) not null PRIMARY KEY AUTO_INCREMENT,
    rname VARCHAR(100) not null
)

-- 权限表db_auth
CREATE TABLE t_authority(
    aid int(10) not null PRIMARY KEY AUTO_INCREMENT,
    aname VARCHAR(100) not NULL,
    url VARCHAR(100) not NULL
)
-- 意义上的中间表 
CREATE TABLE t_role_authority(
    rid int(10) not null,
    aid int(10) not NULL,
    KEY index_rid(rid),
    KEY index_aid(aid)
)

CREATE TABLE t_user_role(
    uid int(10) not null,
    rid int(10) not null,
    KEY index_uid(uid),
    KEY index_rid(rid)
)
img_a055ac723c5ef7aaa04d98f3866746ea.png
没有任何关联关系的5张表

项目框架选型我用的是SpringBoot+MyBatis

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现之间关联的方式有很多种,其中一种方式是通过建立中间关联实现。下面我以一个具体的例子来说明。 假设我们有两个:用户(User)和角色(Role),一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。我们可以通过建立中间关联(User_Role)来实现之间关联。 中间关联(User_Role)通常包含两个字段:用户ID(user_id)和角色ID(role_id),并且将这两个字段作为联合主键。这样,当一个用户拥有多个角色时,就可以在中间关联中添加多条记录,每条记录对应一个用户和一个角色的关系。 具体的实现步骤如下: 1. 创建用户(User)和角色(Role): ``` CREATE TABLE User ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL ); CREATE TABLE Role ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL ); ``` 2. 创建中间关联(User_Role): ``` CREATE TABLE User_Role ( user_id INT NOT NULL, role_id INT NOT NULL, PRIMARY KEY (user_id, role_id) ); ``` 3. 将中间关联(User_Role)与用户(User)和角色(Role)建立关联: ``` ALTER TABLE User_Role ADD CONSTRAINT fk_user_role_user FOREIGN KEY (user_id) REFERENCES User(id); ALTER TABLE User_Role ADD CONSTRAINT fk_user_role_role FOREIGN KEY (role_id) REFERENCES Role(id); ``` 这样,当我们需要查询一个用户的所有角色时,可以通过以下 SQL 语句实现: ``` SELECT Role.* FROM Role JOIN User_Role ON Role.id = User_Role.role_id WHERE User_Role.user_id = <user_id>; ``` 以上就是通过建立中间关联实现之间关联的具体步骤。需要注意的是,如果不添加外键,可能会存在数据不一致的风险,因此建议在建立中间关联时添加外键
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值