此次博客开发,为了更加抽象,主要涉及到的实体为:账号<user>、维度<dimension_*>、维度周边生态<eco_*>。
举个例子,维度可以是阅读金句,这时起的表名可以叫dimension_reading;维度可以加一个写作文章,这是起的表名可以叫dimension_writing……
也就是说这个博客以后可以容纳的所有展示内容都可以上面的规则添加。
再接在往下举例子,维度周边生态可以是评论,这是起的表名可以叫eco_comment。表示针对某个展示内容(即维度)的评论。
为了尽可能简化逻辑,本次实现在数据库实体上,只分三层:账号下面是隶属的维度,维度下面是隶属的生态,账号可以创建生态。(举个例子:用户a发表文章b,用户c在文章b下面评论d)
1. 实体构建(Go 实现)
一般先画 E-R 图,再写代码,但鉴于现在的开发工具比较高级,我们这里先实现实体的结构,再反向生成E-R图做诠释:
账号<user>:
type User struct { Account string `gorm:"not null;unique;" json:"account"` Password string `gorm:"not null;" json:"password"` Base Base `json:"base" gorm:"embedded"` DimensionReadings []*DimensionReading `json:"dimension_readings" gorm:"many2many:user__dimension_reading;constraint:OnDelete:CASCADE;comment:用户建的维度-读书"` DimensionWritings []*DimensionWriting `json:"dimension_writings" gorm:"many2many:user__dimension_writing;constraint:OnDelete:CASCADE;comment:用户建的维度-写作"` DimensionPhotos []*DimensionPhoto `json:"dimension_photos" gorm:"many2many:user__dimension_photo;constraint:OnDelete:CASCADE;comment:用户建的维度-图片"` EcoComments []*EcoComment `json:"eco_comments" gorm:"many2many:user__eco_comment;constraint:OnDelete:CASCADE;comment:用户写的评论"` BindProfiles []*BindProfile `json:"bind_profiles" gorm:"many2many:user__bind_profile;constraint:OnDelete:CASCADE;comment:个人资料"` }
用户资料<bind_profile>(也属于维度)
type BindProfile struct { Nickname string `json:"nickname" gorm:"comment:昵称"` Avatar string `json:"avatar" gorm:"type:json;comment:头像"` Intro string `json:"intro" gorm:"type:text;comment:个人介绍"` Tag string `json:"tag" gorm:"type:json;comment:个人标签"` Base Base `json:"base" gorm:"embedded"` EcoComments []*EcoComment `json:"eco_comments" gorm:"many2many:bind_profile__eco_comment;constraint:OnDelete:CASCADE;"` }
维度:*<dimension_*>
type DimensionReading struct { Author string `gorm:"not null" json:"author"` //作者 Location string `gorm:"not null" json:"location"` //出处 BaseDimension BaseDimension `json:"base_dimension" gorm:"embedded"` EcoComments []*EcoComment `json:"eco_comments" gorm:"many2many:dimension_reading__eco_comment;constraint:OnDelete:CASCADE;comment:这个维度的评论"` Users []*User `json:"users" gorm:"many2many:user__dimension_reading;constraint:OnDelete:CASCADE;comment:这个维度属于谁"` }