采用GaussDB(for MySQL)完成商场会员卡管理系统设计【华为云GaussDB:与数据库同行的日子】

举报
DS小龙哥 发表于 2023/12/06 14:24:19 2023/12/06
【摘要】 这篇文章介绍了如何购买、配置、连接、测试 `GaussDB`数据库,并且最终采用Qt开发了一个具体的软件演示了数据库的具体应用,演示了数据库整体的使用过程。通过对GaussDB的购买、配置、连接到实际应用的全面体验,可以深刻感受到了华为自主创新研发的分布式关系型数据库所带来的便捷与高效。GaussDB不仅具备稳定、安全、易扩展的特点,更在实际应用中展现出卓越的性能和与各种开发工具的良好兼容性。

这篇文章介绍了如何购买、配置、连接、测试 GaussDB数据库,并且最终采用Qt开发了一个具体的软件演示了数据库的具体应用,演示了数据库整体的使用过程。

通过对GaussDB的购买、配置、连接到实际应用的全面体验,可以深刻感受到了华为自主创新研发的分布式关系型数据库所带来的便捷与高效。GaussDB不仅具备稳定、安全、易扩展的特点,更在实际应用中展现出卓越的性能和与各种开发工具的良好兼容性。使用Qt开发的演示软件,充分展示了数据库在实际应用中的便利性,同时也体现了GaussDB在数据处理和管理方面的强大能力。GaussDB无疑为企业和个人用户提供了一个值得信赖的数据库解决方案,帮助我们在数字化时代更好地管理和应用数据。

1701843325859

一、什么是GaussDB?

GaussDB是华为自主创新研发的分布式关系型数据库。该产品支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。

GaussDB分布式形态整体架构如下:



  • Coordinator Node:协调节点CN,负责接收来自应用的访问请求,并向客户端返回执行结果;负责分解任务,并调度任务分片在各DN上并行执行。

  • GTM:全局事务管理器(Global Transaction Manager),负责生成和维护全局事务ID、事务快照、时间戳、sequence信息等全局唯一的信息。

  • Data Node:数据节点DN,负责存储业务数据(支持行存、列存、混合存储)、执行数据查询任务以及向CN返回执行结果。

GaussDB 主备版形态整体架构如下:

  • ETCD:分布式键值存储系统(Editable Text Configuration Daemon)。用于共享配置和服务发现(服务注册和查找)。

  • CMS:集群管理模块(Cluster Manager)。管理和监控分布式系统中各个功能单元和物理资源的运行情况,确保整个系统的稳定运行。

  • Data Node:数据节点DN,负责存储业务数据(支持行存、列存、混合存储)、执行数据查询任务以及返回执行结果。


应用场景

  • 交易型应用

    大并发、大数据量、以联机事务处理为主的交易型应用,如政务、金融、电商、O2O、电信CRM/计费等,服务能力支持高扩展、弹性扩缩,应用可按需选择不同的部署规模。

  • 详单查询

    具备PB级数据负载能力,通过内存分析技术满足海量数据边入库边查询要求,适用于安全、电信、金融、物联网等行业的详单查询业务。


二、创建GaussDB-MySQL数据库

链接:https://www.huaweicloud.com/product/gaussdbformysql.html

【1】选择云数据库

image-20231204145134408


【2】配置实例

image-20231204150109621


【3】提交实例

image-20231206111501235



【4】完成购买

image-20231206111704231


【5】查看数据库详情

目前数据库正在创建中,等待一段时间,在页面可以看到创建成功的提示。

image-20231206111752320



【6】登录数据库

数据库完全创建完毕之后,点击登录测试数据库。

image-20231206113150796



image-20231206112743836



输入数据库账号、密码。

image-20231206112806860


先点击测试连接,测试通过后,点击登录。

image-20231206112823720


【7】新建数据库

点击新建数据库。

image-20231206112857593


输入数据库名称。

image-20231206113019575


提示创建成功。

image-20231206113038654


【8】绑定公网IP

为了方便数据库在公网下能够访问,需要购买公网IP,然后绑定。


(1)点击数据库的实例名称

image-20231206113408108


(2)在数据库的详情页面(点击数据库名字进入)。 就可以看到绑定公网IP的地方。

image-20231206113325045


(3)如果没有就买一个

image-20231206113630483


我选择购买1个月,一M带宽。

image-20231206113709236


image-20231206113742648


image-20231206113844050



(4)继续回到绑定公网IP的页面

image-20231206114017790


image-20231206114037846


绑定成功。

image-20231206114059822


(5)接下来还要配置内网安全组,不然公网IP无法访问。 这一步很重要!

image-20231206134020917


image-20231206134129448


添加成功。

image-20231206134148034



(6)如果不需要SSL协议,也可以自己关闭

image-20231206135923910



【9】实例连接方式

GaussDB(for MySQL)提供使用内网、公网和数据管理服务(Data Admin Service,简称DAS)连接实例的方式。

连接方式 连接地址 使用场景 说明
DAS连接 无需使用IP地址 华为云数据管理服务(Data Admin Service,简称DAS)是一款专业的简化数据库管理工具,提供优质的可视化操作界面,大幅提高工作效率,让数据管理变得既安全又简单。你可以通过数据管理服务连接并管理GaussDB(for MySQL)实例。GaussDB(for MySQL)默认为你开通了远程主机登录权限,推荐你使用更安全便捷的数据管理服务连接实例。 易用、安全、高级、智能。推荐使用DAS连接。
内网连接 读写内网地址 系统默认提供内网IP地址。当应用部署在弹性云服务器上,且该弹性云服务器与GaussDB(for MySQL)实例处于同一区域,同一VPC时,建议单独使用内网IP连接弹性云服务器与GaussDB(for MySQL)数据库实例。 安全性高,可实现GaussDB(for MySQL)的较好性能。推荐使用内网连接。
公网连接 弹性公网IP 不能通过内网IP地址访问GaussDB(for MySQL)实例时,使用公网访问,建议单独绑定弹性公网IP连接弹性云服务器(或公网主机)与GaussDB(for MySQL)数据库实例。 降低安全性。为了获得更快的传输速率和更高的安全性,建议你将应用迁移到与你的GaussDB(for MySQL)实例在同一VPC内 ,使用内网连接。


【10】公网连接实例流程






【11】约束与限制

GaussDB(for MySQL)使用和命名上有一些固定限制,用来提高实例的稳定性和安全性。

功能 使用限制
GaussDB(for MySQL)访问 如果GaussDB(for MySQL)数据库实例没开通公网访问,则该实例必须与弹性云服务器在同一个虚拟私有云内才能访问。弹性云服务器必须处于目标GaussDB(for MySQL)数据库实例所属安全组允许访问的范围内。如果GaussDB(for MySQL)数据库实例与弹性云服务器处于不同的安全组,系统默认不能访问。需要在GaussDB(for MySQL)数据库的安全组添加一条“入”的访问规则。“入”规则开放TCP协议,使用数据库实例的默认端口。GaussDB(for MySQL)数据库实例的默认端口:主备版默认端口为3306,需用户手动修改端口号后,ECS或外网才能访问其他端口。
数据库的root权限 创建实例页面只提供管理员root用户权限(仅限主备版)。
修改数据库参数设置 大部分数据库参数可以通过控制台进行修改。
数据迁移 使用DRS或mysqldump迁移到GaussDB(for MySQL)数据。
MySQL存储引擎 GaussDB(for MySQL)只支持InnoDB存储引擎。
重启GaussDB(for MySQL)实例 无法通过命令行重启,必须通过GaussDB(for MySQL)的管理控制台重启实例。
查看GaussDB(for MySQL)备份 GaussDB(for MySQL)数据库实例在对象存储服务上的备份文件,对用户不可见。
开启binlog GaussDB(for MySQL) 不支持只读节点开启binlog。
分区表 GaussDB(for MySQL)现有产品能力和社区8.0.22版本是兼容的,对于分区表,如果是list分区,目前每个分区的values最多只支持256个,超出会报错。(规避措施:将values个数过多的分区拆成更小的分区,确保每个分区的values个数都不超过256个。)


命名约束:

参数 约束
实例名称 长度在4个到64个字符之间,必须以字母开头,可以包含字母、数字、中划线或下划线,不能包含其他特殊字符。
数据库名称 长度可在1~64个字符之间,由字母、数字、下划线、中划线组成,中划线累计总长度小于等于10个字符,且不能包含其他特殊字符。以下名称不能作为数据库名。extra_healthib_buffer_poolibtmp1logfilesalsql_extra_health
账号(非管理员) 长度在1到32个字符之间,由字母、数字、下划线组成,不能包含其他特殊字符
密码 长度为8~32个字符,至少包含大写字母、小写字母、数字、特殊字符三种字符的组合,其中允许输入~!@#$%^*-_=+?,()&特殊字符。
参数模板名称 长度在1~64个字符之间,区分大小写,可包含字母、数字、中划线、下划线或句点,不能包含其他特殊字符。
备份名称 长度在4~64个字符之间,必须以字母开头,区分大小写,可以包含字母、数字、中划线或者下划线,不能包含其他特殊字符。


【12】GaussDB(for MySQL)与其他服务的关系

GaussDB(for MySQL)与其他服务之间的关系。

相关服务 交互功能
弹性云服务器(ECS) GaussDB(for MySQL)配合弹性云服务器(Elastic Cloud Server,简称ECS)一起使用,通过内网连接GaussDB(for MySQL)可以有效的降低应用响应时间、节省公网流量费用。
虚拟私有云(VPC) 对你的GaussDB(for MySQL)数据库实例进行网络隔离和访问控制。
对象存储服务(OBS) 存储你的GaussDB(for MySQL)数据库实例的自动和手动备份数据。
云监控服务(Cloud Eye) 云监控服务是一个开放性的监控平台,帮助用户实时监测GaussDB(for MySQL)资源的动态。云监控服务提供多种告警方式以保证及时预警,为你的服务正常运行保驾护航。
云审计服务(CTS) 云审计服务(Cloud Trace Service,简称CTS),为用户提供云服务资源的操作记录,供你查询、审计和回溯使用。
数据复制服务(DRS) 使用数据复制服务,实现数据库平滑迁移上云。
企业管理服务(EPS) 企业管理服务(Enterprise Project Management Service,简称EPS)提供统一的云资源按企业项目管理,以及企业项目内的资源管理、成员管理。
标签管理服务(TMS) 标签管理服务(Tag Management Service,简称TMS)是一种快速便捷将标签集中管理的可视化服务,提供跨区域、跨服务的集中标签管理和资源分类功能。
分布式数据库中间件(DDM) 对于云数据库 GaussDB(for MySQL),使用分布式数据库中间件服务(Distributed Database Middleware,简称DDM),后端对接多个数据库实例,实现分布式数据库的透明访问。


【13】GaussDB(for MySQL)与RDS for MySQL的区别

GaussDB(for MySQL)拥有较好的性能、扩展性和易用性。

类别 RDS for MySQL GaussDB(for MySQL)
架构 传统主备架构,主备通过binlog同步数据。 存算分离架构,计算节点共享一份数据,无需通过binlog同步数据。
性能 十万级QPS,高并发场景下性能提升3倍。 百万级QPS,性能是开源MySQL的7倍;复杂查询场景,支持将提取列、条件过滤、聚合运算等操作向下推给存储层处理,性能相比传统架构提升数十倍。
扩展性 最多添加5个只读节点,添加只读所需时间与数据量大小相关,并且需要增加一份存储。存储自动扩容,最大支持4TB。 最多添加15只读,由于共享存储,添加只读节点所需时间与数据量大小无关,且无需增加一份存储。存储自动扩容,最大支持128TB。
可用性 故障自动倒换,RTO通常小于30秒。 主节点和只读节点无需通过binlog进行数据同步,延时更低,故障自动切换,RTO通常小于10秒。
备份恢复 通过全量备份+binlog回放实现任意时间点回滚。 通过全量备份(快照)+redo回放实现任意时间点回滚,备份恢复速度更快。
数据库版本 MySQL 5.6、5.7和8.0。



三、Navicat远程登录数据库

绑定公网IP之后,接下来使用Navicat Premium 16 远程登录数据库,测试数据库的连接情况。


3.1 新建连接

image-20231206114640599


3.2 输入数据库连接参数

主机就填绑定的公网IP。 端口号3306

用户名填root(也可以填自己新建的用户)

密码就是创建数据库的时候设置的密码。

image-20231206114737483


3.3 测试连接

参数填好之后,点击左下角的按钮,测试连接。

正常情况相爱,就看到弹窗,测试连接成功。

如果说连接不了服务器。一定要检查自己的安全组输入规则是否开放了其他IP地址和3306端口的访问.

image-20231206134552082



3.4 登录数据库

测量连接成功之后,回到菜单页面,点击数据库名称就可以连接上数据库。

进入之后,就可以看到我们刚才在华为云网页端创建的数据库名称。 到此,我们的数据库的创建、公网连接已经完成了。接下来就可以正常的使用数据库进行完成我们的应用开发了。

image-20231206134737879




四、门店会员卡管理系统开发


4.1 项目说明

下面采用Qt框架,远程访问刚才创建的华为云的GaussDB-MySQL数据库,开发一款门店会员卡管理系统,完成 注册、充值、消费、查询、销户等基本功能。所有的用户数据都放在华为云的GaussDB-MySQL数据库里。


4.2 新建工程

image-20231123204107281

image-20231123105425946


image-20231123105456525


image-20231123105508309


4.3 修改pro工程文件

增加数据库的支持。

QT       += sql

image-20231123204149759


4.4 设计UI界面

image-20231123204213476


这是设计好的界面:

image-20231123114053797



4.5 需要添加的代码

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>


4.6 会员卡建表代码

//创建VIP卡余额管理表
void Widget::CreateTAB_VIP_Card()
{
    //数据库:建表,如果存在就不创建,不存在就创建
    QSqlQuery sql_query(database);
​
    QString tableName = "vip"; // 要查询的表名,可以根据实际情况修改
​
    //下面语句查询指定的表是否存在.
    sql_query.exec(QString("SELECT COUNT(*) FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema = '%1' AND table_name = '%2'")
               .arg(database.databaseName(), tableName));
​
    if(sql_query.next())
    {
        if(sql_query.value(0).toInt()==0)
        {
            qDebug("数据库表是不存在的.准备创建.\n");
            //创建表格 创建表格语句:create table <table_name> (f1 type1, f2 type2,…);
            /* CREATE TABLE 是告诉数据库系统创建一个新表的关键字。
                * CREATE TABLE 语句后跟着表的唯一的名称
                * 或标识*/
​
            /*下面的语句: 创建一个名称为password的表,字段分别是存放 卡号 姓名 电话 余额*/
​
            QString tableName = "vip";
            QString createSql = "CREATE TABLE " + tableName + "(id INT PRIMARY KEY, card VARCHAR(100), name VARCHAR(100), phone VARCHAR(100), money INT)";
​
​
            sql_query.prepare(createSql);
            if(!sql_query.exec())
            {
                Log_Text_Display("VIP卡余额管理表创建失败.\n");
            }
            else
            {
                Log_Text_Display("VIP卡余额管理表创建成功.\n");
            }
        }
        else
        {
            Log_Text_Display("VIP卡余额管理表是存在的.不需要创建.\n");
        }
    }
}
​


4.7 注册新的会员卡

//注册新的VIP客户
bool Widget::add_VIP_Card(QString card,QString name,QString phone)
{
    if(name.isEmpty())return false;
    if(phone.isEmpty())return false;
​
    //指定操作的数据库
    QSqlQuery sql_query(database);
​
    //查询原数据库表里有没有重复数据
    //查询全部数据
    sql_query.prepare("select * from vip");
    if(!sql_query.exec())
    {
        Log_Text_Display("VIP卡余额管理表查询错误.\n");
    }
    else
    {
        while(sql_query.next())
        {
            //ID、账号、密码、类型
            // int id = sql_query.value(0).toInt(); //ID
            QString find_card = sql_query.value(1).toString(); //卡号
            QString find_name = sql_query.value(2).toString(); //姓名
            QString find_phone = sql_query.value(3).toString(); //电话
            int money = sql_query.value(4).toInt(); //余额
​
            //判断卡号有没有冲突的
            if(find_card==card)
            {
                QMessageBox::information(this,"提示","你使用的卡已经注册!\n请注销后重试.",
                QMessageBox::Ok,QMessageBox::Ok);
                return false;
            }
        }
    }
​
    //查询最大ID
    QString select_max_sql = "select max(id) from vip";
    int max_id = 0;
    sql_query.prepare(select_max_sql);
    if(!sql_query.exec())
    {
        Log_Text_Display("VIP卡余额管理表最大ID查找失败.\n");
    }
    else
    {
        while(sql_query.next())
        {
            max_id = sql_query.value(0).toInt();
        }
​
        Log_Text_Display(QString("data base max id:%1\n").arg(max_id));
​
        //添加数据
        //插入数据 插入语句:insert into <table_name> values (value1, value2,…);
        QString insert_sql = tr("insert into vip values(?,?,?,?,?)");
        sql_query.prepare(insert_sql);
        //if(max_id!=0)max_id+=1; //判断是否是第一次数据
        sql_query.addBindValue(max_id+1); //id
        sql_query.addBindValue(card);    //卡号
        sql_query.addBindValue(name);    //姓名
        sql_query.addBindValue(phone);    //电话
        sql_query.addBindValue(0);    //余额
        if(!sql_query.exec())
        {
            Log_Text_Display("数据插入失败.\n");
        }
        else
        {
            return true;
        }
    }
    return false;
}
​


4.8 会员卡充值

//单卡充值
void Widget::on_pushButton_Recharge_clicked()
{
    QString card=ui->lineEdit_reg_vip_number->text();
    if(card.isEmpty())
    {
        QMessageBox::warning(this,"提示","请输入正确的卡号",QMessageBox::Ok);
        return;
    }
​
    //数据库查询
    //指定操作的数据库
    QSqlQuery sql_query(database);
​
    //查询数据库对应的ID
    int id=0;
    int flag=0;
    QString find_card;
    QString find_name;
    QString find_phone;
    int find_money=0;
​
    //查询全部数据
    sql_query.prepare("select * from vip");
    if(!sql_query.exec())
    {
        Log_Text_Display("数据库查询错误.\n");
    }
    else
    {
        while(sql_query.next())
        {
            id=sql_query.value(0).toInt(); //id
            find_card = sql_query.value(1).toString(); //卡号
            find_name = sql_query.value(2).toString(); //姓名
            find_phone = sql_query.value(3).toString(); //电话
            find_money = sql_query.value(4).toInt(); //余额
​
            if(find_card==card)
            {
                flag=1; //查找成功
                break;
            }
        }
    }
​
    if(flag==0)
    {
        QMessageBox::warning(this,"提示",QString("%1 此卡未注册.").arg(card),QMessageBox::Ok);
        return;
    }
​
​
    //进行充值  UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;
​
    int val=ui->lineEdit_input->text().toInt();
    if(val<=0)
    {
        QMessageBox::warning(this,"提示","请输入充值金额",QMessageBox::Ok);
        return;
    }
​
    find_money=find_money+val;
    //进行充值  字符串类型要用''包起来
    QString cmd=QString("UPDATE vip SET money=%1 WHERE ID=%2").arg(find_money).arg(id);
    sql_query.prepare(cmd);
    if(!sql_query.exec())
    {
        Log_Text_Display("数据库修改错误.\n");
    }
​
    qDebug()<<cmd;
​
​
    QString info=QString("卡号:%1\n姓名:%2\n电话:%3\n余额:%4\n")
            .arg(card)
            .arg(find_name)
            .arg(find_phone)
            .arg(QString("%1").arg(find_money));
    QMessageBox::information(this,"充值成功",info,QMessageBox::Ok);
​
    on_pushButton_cha_xun_all_clicked();
}
​


4.9 会员卡余额查询

//查询单卡卡余额
void Widget::on_pushButton_query_clicked()
{
    QString card=ui->lineEdit_reg_vip_number->text();
    if(card.isEmpty())
    {
        QMessageBox::warning(this,"提示","请输入正确的卡号",QMessageBox::Ok);
        return;
    }
​
    //数据库查询
    //指定操作的数据库
    QSqlQuery sql_query(database);
​
    //查询数据库对应的ID
    int id=0;
    int flag=0;
    QString find_card;
    QString find_name;
    QString find_phone;
    int find_money=0;
​
    //查询全部数据
    sql_query.prepare("select * from vip");
    if(!sql_query.exec())
    {
        Log_Text_Display("数据库查询错误.\n");
    }
    else
    {
        while(sql_query.next())
        {
            id=sql_query.value(0).toInt(); //id
            find_card = sql_query.value(1).toString(); //卡号
            find_name = sql_query.value(2).toString(); //姓名
            find_phone = sql_query.value(3).toString(); //电话
            find_money = sql_query.value(4).toInt(); //余额
​
            if(find_card==card)
            {
                flag=1; //查找成功
                break;
            }
        }
    }
​
    if(flag==0)
    {
        QMessageBox::warning(this,"提示",QString("%1 此卡未注册.").arg(card),QMessageBox::Ok);
        return;
    }
​
    QString info=QString("卡号:%1\n姓名:%2\n电话:%3\n余额:%4\n")
            .arg(card)
            .arg(find_name)
            .arg(find_phone)
            .arg(QString("%1").arg(find_money));
    QMessageBox::information(this,"查询信息",info,QMessageBox::Ok);
}


4.10 查询全部信息

//查询VIP卡全部信息
void Widget::on_pushButton_cha_xun_all_clicked()
{
    //设置全选
    for(int i=0;i<ui->tableWidget_card_cha_xun->rowCount();i++)
    {
        ui->tableWidget_card_cha_xun->item(i,0)->setSelected(true);
    }
    /*获取选中的列表里的所有条目*/
    QList<QTableWidgetItem*> list=ui->tableWidget_card_cha_xun->selectedItems();
​
    /*从列表中依次移除条目*/
    for(int i=0;i<list.count();i++)
    {
        /*获取条目的行号*/
        int row=ui->tableWidget_card_cha_xun->row(list.at(i));
        delete list.at(i); //彻底删除条目
        //因为上面的循环是以条目数量为准,所以卸载行号只需要卸载一行即可
        if(row!=-1)
        {
            ui->tableWidget_card_cha_xun->removeRow(row);
        }
    }
​
    //指定操作的数据库
    QSqlQuery sql_query(database);
    //查询全部数据
    sql_query.prepare("select * from vip");
    if(!sql_query.exec())
    {
        Log_Text_Display("数据库查询错误.\n");
    }
    else
    {
        while(sql_query.next())
        {
            QString card = sql_query.value(1).toString(); //卡号
            QString name = sql_query.value(2).toString(); //姓名
            QString phone = sql_query.value(3).toString(); //电话
            int money=sql_query.value(4).toInt(); //余额
​
            //返回行数。
            int RowCount=ui->tableWidget_card_cha_xun->rowCount(); //获取当前总行数
            ui->tableWidget_card_cha_xun->setRowCount(RowCount+1); //设置行数
            int i;
            //通过总列数创建单元格
            for(i=0;i<ui->tableWidget_card_cha_xun->columnCount();i++)
            {
                ui->tableWidget_card_cha_xun->setItem(RowCount,i,new QTableWidgetItem(""));
                //设置文本对齐方式
                ui->tableWidget_card_cha_xun->item(RowCount,i)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
            }
​
            //设置文本
            ui->tableWidget_card_cha_xun->item(RowCount,0)->setText(card);
            ui->tableWidget_card_cha_xun->item(RowCount,1)->setText(name);
            ui->tableWidget_card_cha_xun->item(RowCount,2)->setText(phone);
            ui->tableWidget_card_cha_xun->item(RowCount,3)->setText(QString("%1元").arg(money));
        }
    }
}
​



4.11 编译运行

【1】运行之后,就可以正常的添加用户了。

image-20231206135635961


【2】对指定的用户进行充值

image-20231206135744877


image-20231206140143990


【3】查询指定用户信息

image-20231206135818915



五、登录数据库查看数据

5.1 软件端的数据

目前在我们开发的软件端,已经存入了5个用户。

image-20231206140251341


5.2 Navicat登录查看

image-20231206140332320


5.3 华为云控制台登录查看

image-20231206140438794


六、总结

这篇文章介绍了如何购买、配置、连接、测试 GaussDB数据库,并且最终采用Qt开发了一个具体的软件演示了数据库的具体应用,演示了数据库整体的使用过程。

通过对GaussDB的购买、配置、连接到实际应用的全面体验,可以深刻感受到了华为自主创新研发的分布式关系型数据库所带来的便捷与高效。GaussDB不仅具备稳定、安全、易扩展的特点,更在实际应用中展现出卓越的性能和与各种开发工具的良好兼容性。使用Qt开发的演示软件,充分展示了数据库在实际应用中的便利性,同时也体现了GaussDB在数据处理和管理方面的强大能力。GaussDB无疑为企业和个人用户提供了一个值得信赖的数据库解决方案,帮助我们在数字化时代更好地管理和应用数据。




我正在参加【有奖征文 第28期】华为云GaussDB:与数据库同行的日子! 链接:https://bbs.huaweicloud.com/blogs/415547

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200