实体关系在数据库表和Go数据类型中的表现形式
通过对ent的学习,我们了解到实体关系大致分了八个模式
那么这些实体关系是如何在数据表和数据类型定义中体现的呢
ent实体框架中的边(关系或实体之间的关联)
- 1对1
- 1对1 自引用
- 1对1 双向自引用
- 1对多
- 1对多 自引用
- 多对多
- 多对多 自引用
- 多对多 双向自引用
自引用和双向自引用在数据结构是其实一样的,它是对于有向图来说
我们暂时只针对无向图,在数据存储结构上来说,其实分为一对一、一对多和多对多。
在数据表中的表现形式
在数据表存储时,使用数据表外键(foreign key)来表示实体之间的关联关系
- 一对一
TODO
- 一对多
TODO
- 多对多
TODO
在Go数据类型中的表现形式
在Go数据类型中,使用结构体类型字段表示数据库外键,以及数据关联模型的引用
- A属于B
// `User` 属于 `Company`,`CompanyID` 是外键
type User struct {
gorm.Model
Name string
CompanyID int
Company Company
}
type Company struct {
ID int
Name string
}
- A包含B
// User 有一张 CreditCard,UserID 是外键
type User struct {
gorm.Model
CreditCard CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
- A包含很多B
// User 有多张 CreditCard,UserID 是外键
type User struct {
gorm.Model
CreditCards []CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
- 多对多
// 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;"`
}
存在关联表 user_languages;