【学习需要,仅此记录,如有缺漏,敬请指正】

操作系统:Windows 11家庭版
提前安装好的软件:postgresql数据库、MSYS2(安装好之后,命令安装MinGW64并设置环境变量)、Navicat数据库管理工具、能运行c++程序的IDE工具

1、SSB数据集下载

(1)ssb-dbgen工具下载

https://github.com/electrum/ssb-dbgen
点击【code】,选择【Download ZIP】下载。下载后解压。
在这里插入图片描述

(2)ssb-dbgen编译

网上教程大多数是在linux上直接编译,或者是用visual studio进行编译,这里我直接在windows上采用MinGW64工具进行编译

打开MSYS MINGW64命令界面,进入到dbgen源码目录,输入make进行编译:
在这里插入图片描述
编译完成之后可能会报很多warning,但是生成了dbgen.exe文件,并不影响后续的使用。
在这里插入图片描述

(3)生成数据文件

参考博客:https://www.cnblogs.com/tgzhu/p/9083092.html

还是在MSYS2 MINGW64命令界面,进入到刚刚生成dbgen.exe的文件目录(如果没有移动,那这个文件就在dbgen源码目录下),输入以下命令,生成对应的数据文件:

./dbgen -s 1 -T c
./dbgen -s 1 -T p
./dbgen -s 1 -T s
./dbgen -s 1 -T d
./dbgen -s 1 -T l

一共5个表,规模参数是1,一般是最小量的数据。如果要一次性生成这个5个文件,可以使用以下命令:

./dbgen -s 1 -T a

2、导入postgresql数据库

(1)数据文件预处理

参考博客:https://www.cnblogs.com/yongzhewudi/p/5371396.html

因为dbgen.exe生成的.tbl文件,每一行最末尾都有一个“|”作为分隔符,这样的格式在导入过程中会出现错误,因此要做处理:将每一行最末尾的"|"换成换行符。

程序的代码如下(参考自以上博客),保存的时候记得后缀名是.cpp

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main() { 
    string s;
    ifstream in;in.open("F:/ssb/dbgen/part.tbl");
    ofstream out;
    out.open("F:/ssb/data/part.tbl");  
    if (in.is_open()) {
        for ( ;getline(in, s);) {
            int len = s.length();
            int i = len - 1;
            if (s[i] == '|')
                s[i] = '\n';
            out << s;
        }
        out.close();
    }
}

第一个路径是你存放处理之前的.tbl文件的路径;
第二个路径是你处理之后的.tbl文件的存放路径。

(2)创建数据库和表模式

① 用数据库管理工具连接postgresql数据库,先创建一个新的数据库:

create database ssb;

② 使用该数据库,并在里面创建对应的表结构:

\c ssb;

--lineorder
CREATE TABLE lineorder (
  LO_ORDERKEY number, LO_LINENUMBER number, LO_CUSTKEY number,
  LO_PARTKEY number, LO_SUPPKEY number, LO_ORDERDATE number,
  LO_ORDERPRIORITY char(15),  LO_SHIPPRIORITY char(1), LO_QUANTITY number,
  LO_EXTENDEDPRICE number, LO_ORDTOTALPRICE number, LO_DISCOUNT number,
  LO_REVENUE number, LO_SUPPLYCOST number, LO_TAX number,
  LO_COMMITDATE number, LO_SHIPMODE char(10));

--supplier
CREATE TABLE supplier (
  S_SUPPKEY number, S_NAME char(25), S_ADDRESS varchar(25), S_CITY char(10),
  S_NATION char(15), S_REGION char(12), S_PHONE char(15));

--part
CREATE TABLE part (
 P_PARTKEY number, P_NAME varchar(22), P_MFGR char(6), P_CATEGORY char(7),
 P_BRAND1 char(9), P_COLOR varchar(11), P_TYPE varchar(25), P_SIZE number,
 P_CONTAINER char(10));

--customer
CREATE TABLE customer (
  C_CUSTKEY number, C_NAME varchar(25), C_ADDRESS varchar(25),
  C_CITY char(10), C_NATION char(15), C_REGION char(12), C_PHONE char(15),
  C_MKTSEGMENT char(10)) ;

--dates
CREATE TABLE dates (
 D_DATEKEY number, D_DATE char(18), D_DAYOFWEEK char(10), D_MONTH char(9),
 D_YEAR number, D_YEARMONTHNUM number, D_YEARMONTH char(7),
 D_DAYNUMINWEEK number, D_DAYNUMINMONTH number, D_DAYNUMINYEAR number,
 D_MONTHNUMINYEAR number, D_WEEKNUMINYEAR number, D_SELLINGSEASON char(12),
 D_LASTDAYINWEEKFL char(1), D_LASTDAYINMONTHFL char(1), D_HOLIDAYFL char(1),
 D_WEEKDAYFL char(1)) ;

(3)导入数据

参考博客:https://www.cnblogs.com/yongzhewudi/p/5371396.html

用数据库管理工具执行以下命令:

copy customer from 'F:\ssb\data\customer.tbl' DELIMITER '|';
copy supplier from 'F:\ssb\data\supplier.tbl' DELIMITER '|';
copy part from 'F:\ssb\data\part.tbl' DELIMITER '|';
copy lineorder from 'F:\ssb\data\lineorder.tbl' DELIMITER '|';
copy dates from 'F:\ssb\data\date.tbl' DELIMITER '|';

【注】:注意表名和数据库中已创建的表名一致;数据文件名称和你存放的处理之后的数据文件名称一致!

导入之后,为了使数据之间的约束更加完整,可以参考网上的教程添加主外键约束。

导入成功之后,就可以使用SQL语句进行操作了。

【学习需要,仅此记录,如有缺漏,敬请指正】

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐