Gorm Many To Many

news2025/1/13 10:03:51

写cmdb的时候要去做一些软件资源的落库,发布要使用到的应用属性。应用有哪些属性?

应用有它的type类型,是api还是admin,还是job或者task。它的语言是go java.....,它的own也就是属于哪个开发的,这是它的属性。

应用和own是多对多的关系,一个应用表,一个开发表。一个应用有多个负责人,一个开发好几个人迭代这个应用。反过来就是一个开发对应多个应用。

所以应用服务和开发它就是多对多的关系。一个开发对应多个应用,一个应用对应多个开发。

Many To Many

双向一对多就是多对多

如果将学生和课程放在一张表里面即造成了学生数据的冗余,同时又造成了课程数据的冗余。

一对多一般是拆成两张表,但是多对多至少要拆成三张表了。

首先拆分为两张基础表,一张是学生信息表,一张是课程信息表。一种是维护学生的各种信息的,一种是维护课程的各种信息。

这就两张表了,同时还需要一张中间表,中间表就是维护课程和学生关联关系的。

比如一个张三报名了两门课程go和vue,张三的userid是1,在中间表两个userid为1对应的是两个lesson。最后在去做关联操作和关联查询的时候就可以通过这三张表将整个信息查询出来。

其实真正数据冗余的就是中间表,但是中间表也不算冗余,因为只有两个字段,两个字段都是带索引的,不会去占用很多空间。

  • Many to Many 会在两个 model 中添加一张连接表。
  • 例如,您的应用包含了 user language,且一个 user 可以说多种 language,多个 user 也可以说一种 language
  • 当使用 GORM AutoMigrate User 创建表时,GORM 会自动创建连接表(当去建立了多对多的关系,这张中间表gorm就会自动帮你创建)
package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	Languages []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
	gorm.Model
	Name string
}

func main() {
	dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	db.AutoMigrate(Language{}, User{})
}

 2. 反向引用

上面两个的相同点,基于这两个结构体生成数据库表里面的字段,结构都是一模一样的。
Languages []Language `gorm:"many2many:user_languages;"`

这里有两个功能,一个作用是声明多对多关系,它去找哪个类型去和它做多对多关联。

还有一个作用是通过users点出language,其实也就是可以拿到成员的信息,但是其实数据库表是没有这个东西的。(这个就是看场景需不需要通过language点出user)

上面如果做了关联关系,那么至少有一个地方得写这个玩意。

// User 拥有并属于多种 language,`user_languages` 是连接表
type User struct {
    gorm.Model
    Languages []*Language `gorm:"many2many:user_languages;"`
}


type Language struct {
    gorm.Model
    Name string
    Users []*User `gorm:"many2many:user_languages;"`
}
3. 重写外键
对于 many2many 关系,连接表会同时拥有两个模型的外键
type User struct {
    gorm.Model
    Languages []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
    gorm.Model
    Name string
}

// 连接表:user_languages
// foreign key: user_id, reference: users.id
// foreign key: language_id, reference: languages.id
若要重写它们,可以使用标签 foreignKey references joinforeignKey
joinReferences 。(一般正常使用表名.id就足够了,自己写的话容易搞错)
当然,您不需要使用全部的标签,你可以仅使用其中的一个重写部分的外键、引用

 

 

在定义多对多关系其实是可以去定义第三张表的,

type Person struct {
ID int
Name string
Addresses []Address `gorm:"many2many:person_addresses;"`
}
type Address struct {
ID uint
Name string
}
type PersonAddress struct {
PersonID int `gorm:"primaryKey"`
AddressID int `gorm:"primaryKey"`
CreatedAt time.Time
DeletedAt gorm.DeletedAt
}
func main() {
// 0、连接数据库
dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
// 1、自动创建多对多表结构
db.AutoMigrate(
Person{},
Address{},
)
// 2、添加数据
persons := Person{
ID: 1,
Name: "zhangsan",
Addresses: []Address{
{ID: 1, Name: "bj"},
{ID: 2, Name: "sh"},
},
}
db.Create(&persons)
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设备管理模块实现

文章目录 1 .导航树模块的实现2. 查询定位功能的实现3. 资源管理功能的实现4. 电缆段入沟功能实现 1 .导航树模块的实现 导航树的各节点是通过Ajax 技术异步加载的,系统初始化时导航树只会加载初始的城市节点,用户根据自身需要选择相应的父节点加载其逻…

Flink安装与编程实践

系列文章目录 Ubuntu常见基本问题 Hadoop3.1.3安装(单机、伪分布) Hadoop集群搭建 HBase2.2.2安装(单机、伪分布) Zookeeper集群搭建 HBase集群搭建 Spark安装和编程实践(Spark2.4.0) Spark集群搭建 文章目…

mongoDB相关知识

目录 常用操作删除数据库 启动问题集如何远程访问mongDB数据库由于widows安全策略,linux访问不到windows的mongDB 常用操作 删除数据库 windows下mongDB通过下面命令行进入 D:\mongodb\mongodb-win32-x86_64-2008plus-ssl-3.6.23-8-gc2609ed3ed\bin>mongod.exe…

Unity开发前的一些建议1_设置脚本的编码格式,设置IDE的编码格式

Unity开发前的一些建议1_设置脚本的编码格式,设置IDE的编码格式 乱码之后是是不可以撤回的哦。 这么做的理由,Unity右侧的Inspector面板看代码是UTF-8格式的。可以在Inspector中速览代码,且如果修改IDE,UTF-8比其他编码格式用的…

K8S复习

本文原文出自本人自己复习时整理,原文非常系统,建议拜师#yyds干货盘点# 手把手教你玩转 Kubernete 集群搭建(03)_wzlinux的博客-CSDN博客 1.docker的优势 在某一段时期内,大家一提到 Docker,就和容器等价起来,认为 Doc…

【架构】后端服务架构高性能设计方法

文章目录 前言1、无锁化1.1、串行无锁1.2、结构无锁 2、零拷贝2.1、内存映射2.2、零拷贝 3、序列化3.1、分类3.2、性能指标3.3、选型考量 4、池子化4.1、内存池4.2、线程池4.3、连接池4.4、对象池 5、并发化5.1、请求并发5.2、冗余请求 6、异步化6.1、调用异步化6.2、流程异步化…

【跟晓月学数据库】使用MySQLdump 对数据导入导出

前言 大家好,我是沐风晓月,今天给大家介绍MySQLdump的数据导出导入,希望对你有用。 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,阿里云社区专家博主&…

vue3+antd-design-vue+vite项目总结

代码热更新能力失效,每次都需要手动刷新,开发体验极差 1、先看看是否开启了热更新 2、再看看引入模块文件名是否正确。当前的项目部分人可以更新,部分不能,所以和1没什么关系,网上搜索发现vite对文件名大小写十分敏感&…

2-3查找树

2-3查找树 为了保证查找树的平衡性,我们需要一些灵活性,因此在这里我们允许树中的一个结点保存多个键。确切的说,我 们将一棵标准的二叉查找树中的结点称为2-结点(含有一个键和两条链),而现在我们引入3-结点,它含有两…

Java版本企业招投标采购管理系统源码 +支持二开+spring cloud

一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑&#x…

如何访问NetApp E系列存储的CLI命令行

NetApp存储的E系列(e-series)是收购LSI存储而来的,所以这个产品的install base,也就是安装量其实是很大的,因为早期LSI的商业模式就是OEM,给很多的IT公司做过OEM,比较典型的就是IBM的早期的DS存…

我想搭建一个商城?有哪些流程?

近年来,我国电子商务发展迅速。淘宝、京东、亚马逊等一大批电子商务巨头受到越来越多消费者的青睐。互联网普及率大大提高,消费者也逐渐形成了网上购物的习惯。在支付体验、物流服务和售后服务不断提升的过程中,越来越多的消费者依赖网络购物…

保险信创 数据领航|GBASE南大通用亮相2023年保险行业信息技术应用创新大会

2023年6月,2023年保险行业信息技术应用创新大会在京召开,会议重点围绕保险核心业务系统的改造及终端的选型和应用展开探讨学习,分享行业成功实践经验,着力解决行业信创发展痛点难点,助力行业加快信创生态建设&#xff…

Linux用户权限和认证

linux公钥登录 useradd test -m -g root创建名为test的用户,生成相应目录,同时加入root组passwd test重置密码 分配test用户sudo权限,sudo vim etc/sudoers 编辑SSH文件 vim /etc/ssh/sshd_config PermitRootLoginyes改为no关闭ROOT登录…

基于全卷积神经网络(FCN)实现图像分割

目录 1、作者介绍2、网络及数据集介绍2.1 FCN算法2.2 VOC_2012数据集2.3 制作自己的语义分割数据集2.3.1 标注方式一:多边形标注2.3.1.1 labelMe安装与数据标注2.3.1.2 数据格式转换2.3.1.3 数据集分类 2.3.2 标注方式二:像素级涂抹 3、基于RESNet50骨干…

Linux 学习记录39(C高级篇)

Linux 学习记录39(C高级篇) 本文目录 Linux 学习记录39(C高级篇)一、gdb调试工具1. gdb工具的使用 二、枚举类型 enum1. 定义 三、Makefile1. 什么是makefile2. 什么是Make3. Make用途4. Makefile的工作过程(1. Makefile分步编译的目的 5. Makefile的语法规则6. Makefile变量的…

【unity每日一记】那些动作基础你还记得吗—移动和旋转相关

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

农村电商APP软件开发 电商新农村紧跟时代脚步

互联网技术的深入发展让电子商务走向了高潮,不过在一些交通闭塞的乡村地区,电商发展还处于初期阶段。大量农产品从生产到流通渠道的变革,让互联网农产品成为新型农业发展的重要手段,不仅增加了农业产值提高了农民收入,…

《kafka 核心技术与实战》课程学习笔记(六)

生产者消息分区机制原理剖析 为什么分区? Kafka 有主题(Topic)的概念,它是承载真实数据的逻辑容器,而在主题之下还分为若干个分区,也就是说 Kafka 的消息组织方式实际上是三级结构:主题 - 分区…

[CKA]考试之四层负载均衡service

由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 重新配置一个已经存在的front-end的deployment,在名字为nginx的容…