非结构化数据(图片,视频等)写入数据库(MySQL,DWS)

文章介绍了如何在MySQL和华为DWS(GaussDB,基于PostgreSQL)中存储视频图片等二进制数据。在MySQL中使用tinyblob到longblob的不同数据类型,而在DWS中推荐使用bytea类型。文章提供了Java代码示例,展示了如何通过预编译语句和文件输入流进行数据插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近遇到一个新需求,需要将视频图片等数据存到数据库中方便业务调用,研究测试了一下MySQL和华为高斯库(DWS库,基于PostgreSQL)的相应解决方案(业务用到这两个数据库,故目前只测试了这两种),予以记录。

1、MySQL

        MySQL中有存储此类数据对应的数据类型tinyblob、blob、mediumblob、longblob,这四种类型的区别在于最大存储空间的区别,按需选择即可。

        

         建好表,设置好字段类型后直接上代码:

public static void insertData(String s, byte[] bytes) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.
                    getConnection(
                            "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8",
                    "root", "admin");
            ps = conn.prepareStatement("insert into te2 (id, name) values (?, ?)");
            ps.setString(1, s);
            // 数据库类型为MediumBlob,可以直接按byte[]类型处理
            ps.setBytes(2, bytes);

            // 两种方法作用相同
//            FileInputStream fileInputStream =
//                    new FileInputStream(
//                            new File("C:\\Users\\Administrator\\Pictures\\f31fbe096b63f624812951928744ebf81a4ca32f.jpg"));
//            ps.setBlob(2, fileInputStream);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (ps != null) {
                    ps.close();
                }
            } catch (Exception e1) {
                e1.printStackTrace();
            } finally {
                try{
                    if(conn != null){
                        conn.close();
                    }
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }
    }

        需要注意的是预编译语句中的参数设置方法使用setBytes或者setBlob都可以,只是不同的方法使用的时候需要将参数类型作以改变。

2、DWS(GaussDB)

        DWS中存储此类数据对应的数据类型选择bytea。虽然高斯库中也有blob类型和raw类型可选,但是官方文档中也说明了这两种数据类型不支持列存储。

 建表完成后同样用代码操作即可。PS:此处不再放冗余代码,异常需自行处理:

Connection conn = DruidUtil.getConnection();
File file = new File("D:\\test\\1.bmp");
FileInputStream fis = new FileInputStream(file);

PreparedStatement ps = conn.prepareStatement("insert into test_schema.test_t1(id, value) values (?, ?)");
ps.setString(1, "t1");
ps.setBinaryStream(2, fis);
ps.executeUpdate();

fis.close();
ps.close();
conn.close();

使用setBinaryStream方法即可将二进制数据存入库中。

<think>嗯,用户想了解数据仓库的定义和原理。首先,我需要回忆一下相关的知识,可能要从数据仓库的基本概念开始。记得数据仓库之父是Bill Inmon,他提出的定义应该是面向主题、集成、非易失且随时间变化的数据集合。引用[1]里也提到了这些特点,所以这部分可以引用。 接下来,用户可能想知道数据仓库的结构和分层原理。根据引用[2],数据仓库通常有ODS层、DWD层、DWS层等。ODS是操作数据存储,DWD是明细数据层,进行轻度汇总和维度退化,DWS是汇总层。需要解释每一层的作用,比如ODS存储原始数据,DWD进行清洗和维度处理,DWS汇总数据支持分析。 然后,用户可能对数据仓库的原理感兴趣。这里应该包括ETL过程,即抽取、转换、加载。引用[3]提到了ETL数据导入,所以可以引用这部分。ETL的过程需要详细说明,比如抽取业务数据,转换清洗,加载到数据仓库中。另外,OLAP分析和数据建模也是原理的一部分,比如星型模型和雪花模型,这些在引用[3]里可能也有涉及。 用户可能还想知道数据仓库的应用场景,比如商业智能、历史数据分析等,引用[1]提到了辅助决策和构建商业智能,可以引用到这里。同时,需要对比数据仓库和业务数据库的区别,比如数仓面向分析,业务数据库面向事务处理,这也是引用[1]里的内容。 要确保回答结构清晰,分点说明定义、结构、原理和应用场景。使用用户提供的引用标注,比如引用[1]、[2]、[3]来支持各个部分的内容。注意检查是否遗漏了关键点,比如数据仓库的非易失性、面向主题等特性,以及分层结构的具体功能。同时,生成的三个相关问题需要围绕数据仓库的架构、ETL优化和应用案例展开,确保问题相关且有引导性。</think>### 数据仓库的定义及原理 #### 一、数据仓库定义 数据仓库(Data Warehouse, DW)由比尔·恩门(Bill Inmon)提出,定义为**面向主题的、集成的、非易失的且随时间变化的数据集合**[^1]。其核心目的是整合企业历史数据,支持决策分析,例如通过OLAP(联机分析处理)和数据分析技术构建商业智能。 - **面向主题**:围绕业务主题(如销售、用户)组织数据,而非业务系统的事务处理。 - **集成性**:数据从多个业务系统抽取后,需经过清洗、转换和标准化。 - **非易失性**:数据写入后不可修改,仅支持查询和分析。 - **时变性**:数据随时间积累,反映历史变化趋势。 #### 二、数据仓库的分层架构 数据仓库通常分为多层以实现高效管理和分析: 1. **ODS层(操作数据存储)** - 存储从业务系统抽取的原始数据,与源系统保持相同粒度。 - 作用:临时存储,支持数据校验和初步清洗[^3]。 2. **DWD层(明细数据层)** - 对ODS层数据进行**轻度汇总**,通过维度退化(如将商品维度直接嵌入事实表)减少表关联复杂度[^2]。 - 示例:用户行为日志经清洗后,关联时间、地点等常用维度。 3. **DWS层(汇总数据层)** - 按主题进行**高度聚合**,生成宽表(如用户月消费汇总表),直接支持分析需求。 #### 三、核心原理 1. **ETL(抽取-转换-加载)** - **抽取**:从业务数据库(如MySQL)抽取数据。 - **转换**:清洗脏数据(如去重、填充缺失值)、统一数据格式(如日期标准化)。 - **加载**:将处理后的数据按分层规则写入数仓,例如通过`CREATE TABLE`和存储过程实现。 2. **OLAP分析** - 基于多维数据模型(星型模型、雪花模型)实现快速分析,支持钻取、切片等操作。 3. **数据建模** - **事实表**:记录业务过程度量值(如销售额),关联多个维度表。 - **维度表**:描述业务上下文(如时间、地理位置)。 #### 四、应用场景 - **商业智能(BI)**:通过Tableau等工具生成销售趋势报告。 - **历史数据分析**:分析用户5年内的购买行为以优化营销策略。 - **数据湖联动**:将数仓的聚合数据数据湖的原始数据结合,支持机器学习模型训练。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值