【学习需要,仅此记录,如有缺漏,敬请指正】
操作系统: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语句进行操作了。
【学习需要,仅此记录,如有缺漏,敬请指正】