GO多类型数据库存储设计

在设计数据库关联时,可以考虑将模型设计得足够灵活,以便能够有效地存储到不同的数据库系统中,如 SQLite 或 PostgreSQL(Pg)。下面我将展示一种通用的设计思路,该设计可以适应 SQLite 和 PostgreSQL,并且能够有效处理不同的数据类型和关联。

数据库设计

假设我们要设计一个简单的内容管理系统(CMS),包括 userspostscomments 表。这些表之间的关联如下:

  • users 表:存储用户信息。
  • posts 表:存储文章信息,并关联到 users
  • comments 表:存储评论信息,关联到 postsusers

我们希望这个设计能够适应 SQLite 和 PostgreSQL。以下是设计示例及其对应的 SQL 语句:

1. 数据表设计

用户(users)

CREATE TABLE users (
    id SERIAL PRIMARY KEY,          -- 使用 SERIAL (PostgreSQL) 或 INTEGER PRIMARY KEY AUTOINCREMENT (SQLite) 自动递增 ID
    name VARCHAR(255) NOT NULL,    -- 存储用户名称
    email VARCHAR(255) UNIQUE NOT NULL  -- 存储用户邮箱,要求唯一
);

帖子(posts)

CREATE TABLE posts (
    id SERIAL PRIMARY KEY,          -- 使用 SERIAL (PostgreSQL) 或 INTEGER PRIMARY KEY AUTOINCREMENT (SQLite) 自动递增 ID
    title VARCHAR(255) NOT NULL,   -- 存储帖子标题
    content TEXT,                  -- 存储帖子内容
    user_id INTEGER,               -- 存储发帖用户的 ID
    FOREIGN KEY (user_id) REFERENCES users(id) -- 外键关联到 users 表
);

评论(comments)

CREATE TABLE comments (
    id SERIAL PRIMARY KEY,          -- 使用 SERIAL (PostgreSQL) 或 INTEGER PRIMARY KEY AUTOINCREMENT (SQLite) 自动递增 ID
    content TEXT NOT NULL,         -- 存储评论内容
    post_id INTEGER,               -- 存储评论关联的帖子 ID
    user_id INTEGER,               -- 存储评论者的 ID
    FOREIGN KEY (post_id) REFERENCES posts(id),  -- 外键关联到 posts 表
    FOREIGN KEY (user_id) REFERENCES users(id)    -- 外键关联到 users 表
);

使用 GORM 进行数据库操作

GORM 是 Go 语言中的一个 ORM 库,它支持多种数据库,包括 SQLite 和 PostgreSQL。以下是如何使用 GORM 来定义模型并进行操作。

1. 安装 GORM
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite  # 对于 SQLite
go get -u gorm.io/driver/postgres  # 对于 PostgreSQL
2. 定义数据模型
package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string `gorm:"size:255"`
    Email string `gorm:"size:255;unique"`
    Posts []Post
    Comments []Comment
}

type Post struct {
    ID     uint   `gorm:"primaryKey"`
    Title  string `gorm:"size:255"`
    Content string
    UserID uint
    User   User `gorm:"foreignKey:UserID"`
    Comments []Comment
}

type Comment struct {
    ID     uint   `gorm:"primaryKey"`
    Content string
    PostID  uint
    UserID  uint
    Post    Post `gorm:"foreignKey:PostID"`
    User    User `gorm:"foreignKey:UserID"`
}

func main() {
    // PostgreSQL DSN
    // dsn := "user=username password=password dbname=mydb port=5432 sslmode=disable"
    
    // SQLite DSN
    dsn := "file:mydb.db?cache=shared&mode=rwc"

    // Choose database driver
    // db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // Auto migrate schema
    db.AutoMigrate(&User{}, &Post{}, &Comment{})
}

数据关联操作

1. 创建和查询数据
func createUser(db *gorm.DB, name, email string) error {
    user := User{Name: name, Email: email}
    return db.Create(&user).Error
}

func createPost(db *gorm.DB, title, content string, userID uint) error {
    post := Post{Title: title, Content: content, UserID: userID}
    return db.Create(&post).Error
}

func createComment(db *gorm.DB, content string, postID, userID uint) error {
    comment := Comment{Content: content, PostID: postID, UserID: userID}
    return db.Create(&comment).Error
}

func getUserWithPosts(db *gorm.DB, userID uint) (User, error) {
    var user User
    err := db.Preload("Posts").First(&user, userID).Error
    return user, err
}

func getPostWithComments(db *gorm.DB, postID uint) (Post, error) {
    var post Post
    err := db.Preload("Comments").First(&post, postID).Error
    return post, err
}

总结

  1. 数据库表设计: 设计表时,要考虑表之间的外键关系,并确保设计能够适应 SQLite 和 PostgreSQL 的语法。

  2. 数据模型映射: 使用 GORM 定义数据模型,并选择适当的数据库驱动(如 SQLite 或 PostgreSQL)。

  3. 数据操作: 使用 GORM 执行常见的 CRUD 操作,并通过 Preload 方法进行关联查询。

go实战微服务分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。系统中存在一个以全局的方式管理计算机资源的分布式操作系统。通常,对用户来说,分布式系统只有一个模型或范型。在操作系统之上有一层软件中间件(middleware)负责实现这个模型。一个著名的分布式系统的例子是万维网(World Wide Web),在万维网中,所有的一切看起来就好像是一个文档(Web页面)一样。 [1] 在计算机网络中,这种统一性、模型以及其中的软件都不存在。用户看到的是实际的机器,计算机网络并没有使这些机器看起来是统一的。如果这些机器有不同的硬件或者不同的操作系统,那么,这些差异对于用户来说都是完全可见的。如果一个用户希望在一台远程机器上运行一个程序,那么,他必须登陆到远程机器上,然后在那台机器上运行该程序。 [1] 分布式系统和计算机网络系统的共同点是:多数分布式系统是建立在计算机网络之上的,所以分布式系统与计算机网络在物理结构上是基本相同的。 [1] 他们的区别在于:分布式操作系统的设计思想和网络操作系统是不同的,这决定了他们在结构、工作方式和功能上也不同。网络操作系统要求网络用户在使用网络资源时首先必须了解网络资源,网络用户必须知道网络中各个计算机的功能与配置、软件资源、网络文件结构等情况,在网络中如果用户要读一个共享文件时,用户必须知道这个文件放在哪一台计算机的哪一个目录下;分布式操作系统是以全局方式管理系统资源的,它可以为用户任意调度网络资源,并且调度过程是“透明”的。当用户提交一个作业时,分布式操作系统能够根据需要在系统中选择最合适的处理器,将用户的作业提交到该处理程序,在处理器完成作业后,将结果传给用户。在这个过程中,用户并不会意识到有多个处理器的存在,这个系统就像是一个处理器一样。 [1] 内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统。透明性是指每一个数据库分布节点对用户的应用来说都是透明的,看不出是本地还是远程。在分布式数据库系统中,用户感觉不到数据是分布的,即用户不须知道关系是否分割、有无副本、数据存于哪个站点以及事务在哪个站点上执行等。  什么是微服务?维基上对其定义为:一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,将应用程序构造为一组松散耦合的服务。在微服务体系结构中,服务是细粒度的,协议是轻量级的。微服务(或微服务架构)是一种云原生架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。这些服务通常● 有自己的堆栈,包括数据库和数据模型;● 通过REST API,事件流和消息代理的组合相互通信;● 和它们是按业务能力组织的,分隔服务的线通常称为有界上下文。尽管有关微服务的许多讨论都围绕体系结构定义和特征展开,但它们的价值可以通过相当简单的业务和组织收益更普遍地理解:● 可以更轻松地更新代码。● 团队可以为不同的组件使用不同的堆栈。● 组件可以彼此独立地进行缩放,从而减少了因必须缩放整个应用程序而产生的浪费和成本,因为单个功能可能面临过多的负载。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值