Rumah > pangkalan data > tutorial mysql > Mari bercakap tentang jadual zip pangkalan data

Mari bercakap tentang jadual zip pangkalan data

WBOY
Lepaskan: 2022-06-20 12:01:37
ke hadapan
2734 orang telah melayarinya

Artikel ini membawa anda pengetahuan yang berkaitan tentang mysql, yang terutamanya memperkenalkan isu yang berkaitan dengan jadual zip pangkalan data ialah model data, terutamanya untuk reka bentuk gudang data data. Seperti namanya, apa yang dipanggil zip adalah untuk merakam sejarah Mari kita lihat bersama-sama.

Mari bercakap tentang jadual zip pangkalan data

Pembelajaran yang disyorkan: tutorial video mysql

latar belakang penjanaan jadual zip

Dalam proses reka bentuk model data gudang data, kami sering menghadapi keperluan seperti:

1 Jumlah data yang agak besar

2 akan Dikemas kini, seperti alamat pengguna, maklumat perihalan produk, status pesanan, dll.; untuk melihat maklumat petikan sejarah pesanan pada titik tertentu dalam sejarah Status pada satu masa, contohnya, semak berapa kali pengguna telah mengemas kini dalam tempoh masa tertentu pada masa lalu, dsb.; 🎜>

4. Perkadaran dan kekerapan perubahan tidak begitu besar, contohnya, terdapat 10 juta jumlahnya terdapat kira -kira 100,000 ahli baru dan perubahan setiap hari; daripada jadual ini disimpan setiap hari, maka banyak maklumat yang tidak berubah akan disimpan dalam jumlah penuh setiap kali, yang memudaratkan penyimpanan

Terdapat beberapa pilihan untuk jenis ini daripada jadual:

Pilihan 1: Hanya simpan salinan terkini setiap hari, seperti milik kami Gunakan Sqoop untuk mengekstrak jumlah data penuh terkini ke dalam Hive setiap hari. Pilihan 2: Simpan sekeping data penuh setiap hari.

    Pilihan 3: Gunakan senarai zip.
  • Perbandingan penyelesaian di atas

Pilihan 1

Tidak perlu dikatakan, penyelesaian ini sangat mudah untuk laksanakan. Mudah, lepaskan data hari sebelumnya setiap hari dan ekstrak yang terbaru sekali lagi.

Kelebihan yang jelas Ia menjimatkan ruang. Ia juga sangat mudah untuk beberapa kegunaan biasa.

Kekurangan juga jelas Tiada data sejarah Satu-satunya cara untuk menyemak akaun lama dahulu adalah melalui kaedah lain, seperti melukis dari helaian aliran.

Pilihan 2

Hidangan penuh kepingan setiap hari ialah pelan yang agak selamat dan data sejarahnya ada.

Kelemahannya ialah ia mengambil terlalu banyak ruang storan Jika salinan penuh jadual ini disimpan setiap hari, banyak maklumat yang tidak berubah akan disimpan dalam setiap salinan penuh, yang merupakan pembaziran besar storan. . , saya masih berasa sangat mendalam tentang perkara ini...

Sudah tentu kita juga boleh membuat pertukaran, seperti hanya mengekalkan data bulan lalu? Walau bagaimanapun, permintaan itu tidak tahu malu, dan kitaran hayat data bukanlah sesuatu yang boleh kita kawal sepenuhnya.

Meja zip

Meja zip pada asasnya mengambil kira keperluan kita dalam penggunaan.

Pertama sekali, ia membuat pertukaran dari segi ruang Walaupun ia tidak menempati ruang sekecil Pelan 1, kenaikan hariannya mungkin hanya seperseribu atau sepersepuluh ribu daripada Pelan 2. .

Malah, ia boleh memenuhi keperluan pilihan dua Ia bukan sahaja boleh mendapatkan data terkini, tetapi juga menambah syarat penapis dan mendapatkan data sejarah.

Jadi masih perlu untuk kita menggunakan meja berzip.

Konsep meja zip

Jadual zip ialah model data, yang ditakrifkan terutamanya untuk cara jadual menyimpan data dalam reka bentuk gudang data Seperti namanya, apa yang dipanggil zip adalah untuk rekod sejarah. Rekod maklumat tentang semua perubahan dalam sesuatu daripada permulaannya hingga keadaan semasanya. Jadual zip boleh mengelakkan masalah storan besar-besaran yang disebabkan oleh menyimpan semua rekod untuk setiap hari, dan juga merupakan cara biasa untuk menangani data yang berubah secara perlahan-lahan (SCD2).

Penjelasan daripada Baidu Encyclopedia: Jadual zip ialah jadual yang mengekalkan status sejarah dan data status terkini Bergantung pada butiran zip, jadual zip sebenarnya bersamaan dengan syot kilat, tetapi ia telah dioptimumkan dan beberapa bahagian. telah dialih keluar rekod tidak berubah, rekod pelanggan pada masa zip boleh dipulihkan dengan mudah melalui jadual zip.

Algoritma jadual zip

1 Kumpulkan data penuh hari itu ke jadual ND (NowDay)

2 simpannya dalam jadual OD ( OldDay (hari terakhir);

3. Bandingkan kedua-dua jadual dengan semua medan. (ND-OD) ialah data baharu dan diubah pada hari tersebut, iaitu, kenaikan hari, diwakili oleh W_I;

4. Bandingkan medan penuh dua jadual (OD-ND) ialah data yang perlu ditutup apabila status tamat, diwakili oleh W_U;

5. Tukar kandungan jadual W_I Semua dimasukkan ke dalam jadual sejarah Ini adalah rekod baharu ialah hari semasa, dan tarikh_akhir ialah nilai maksimum, yang boleh ditetapkan kepada '9999 -12-31';

6. Lakukan bahagian W_U jadual sejarah Dalam operasi kemas kini, tarikh_mula kekal tidak berubah, manakala tarikh_akhir ditukar kepada hari semasa, yang merupakan operasi pautan (. OD) dibandingkan dengan jadual W_U, kecuali untuk START_DATE dan END_DATE Jadual W_U akan diguna pakai.

Contoh jadual zip 1

Sebagai contoh mudah, contohnya, terdapat jadual pesanan:

Terdapat 3 rekod pada 20 Jun:

订单创建日期 订单编号 订单状态
2012-06-20 001 创建订单
2012-06-20 002 创建订单
2012-06-20 003 支付完成

Menjelang 21 Jun, terdapat 5 rekod dalam jadual:

订单创建日期 订单编号 订单状态
2012-06-20 001 创建订单
2012-06-20 002 创建订单
2012-06-20 003 支付完成
2012-06-21 004 创建订单
2012-06-21 005 创建订单

Menjelang 22 Jun, terdapat 6 rekod dalam jadual:

订单创建日期 订单编号 订单状态
2012-06-20 001 创建订单
2012-06-20 002 创建订单
2012-06-20 003 支付完成
2012-06-21 004 创建订单
2012-06-21 005 创建订单
2012-06-22 006 创建订单

Kaedah daripada mengekalkan jadual ini dalam gudang data:

1. Hanya simpan salinan penuh, maka data akan sama dengan rekod pada 22 Jun. Jika anda perlu menyemak status pesanan 001 pada 21 Jun , ia tidak akan berpuas hati ;

2 Jika salinan penuh disimpan setiap hari, jadual dalam gudang data mempunyai sejumlah 14 rekod, tetapi banyak rekod disimpan berulang kali dan tiada perubahan tugas. Sebagai contoh, pesanan 002,004, jumlah data adalah besar, ia akan Menyebabkan banyak pembaziran penyimpanan

Jika jadual direka untuk disimpan sebagai jadual berzip sejarah di gudang data, akan ada; jadual seperti berikut:

订单创建日期 订单编号 订单状态 dw_bigin_date dw_end_date
2012-06-20 001 创建订单 2012-06-20 2012-06-20
2012-06-20 001 支付完成 2012-06-21 9999-12-31
2012-06-20 002 创建订单 2012-06-20 9999-12-31
2012-06-20 003 支付完成 2012-06-20 2012-06-21
2012-06-20 003 已发货 2012-06-22 9999-12-31
2012-06-21 004 创建订单 2012-06-21 9999-12-31
2012-06-21 005 创建订单 2012-06-21 2012-06-21
2012-06-21 005 支付完成 2012-06-22 9999-12-31
2012-06-22 006 创建订单 2012-06-22 9999-12-31

Penjelasan:

1 dw_begin_date menunjukkan masa mula kitaran hayat rekod, dw_end_date menunjukkan masa tamat kitaran hayat rekod. ;

2. dw_end_date = '9999-12-31' menunjukkan bahawa rekod pada masa ini dalam status Sah; '9999-12-31';

4 Jika menanyakan petikan sejarah 2012-06-21, kemudian pilih * daripada order_nya di mana dw_begin_date <= '2012-06-21' dan end_date >= '2012 -06-21', penyataan ini akan menanyakan rekod berikut:

Selaras betul dengan rekod dalam jadual sumber pada 21 Jun:
订单创建日期 订单编号 订单状态 dw_bigin_date dw_end_date
2012-06-20 001 支付完成 2012-06-21 9999-12-31
2012-06-20 002 创建订单 2012-06-20 9999-12-31
2012-06-20 003 支付完成 2012-06-20 2012-06-21
2012-06-21 004 创建订单 2012-06-21 9999-12-31
2012-06-21 005 创建订单 2012-06-21 2012-06-21

Dapat dilihat bahawa jadual berzip sejarah bukan sahaja dapat memenuhi permintaan untuk data sejarah, tetapi juga menjimatkan sumber storan pada tahap yang besar

Jadual zip contoh 2:

dalam Mungkin terdapat hanya beberapa rekod kehidupan seseorang dalam jadual sejarah, yang mengelakkan masalah penyimpanan besar-besaran yang disebabkan oleh merekod status pelanggan setiap hari:

人名 开始日期 结束日期 状态
client 19000101 19070901 H在家
client 19070901 19130901 A小学
client 19130901 19160901 B初中
client 19160901 19190901 C高中
client 19190901 19230901 D大学
client 19230901 19601231 E公司
client 19601231 29991231 H退休在家

Setiap rekod di atas tidak dikira pada Sebagai contoh, pada tahun 19070901, pelanggan sudah berada dalam A, bukan H. Oleh itu, kecuali rekod terakhir, yang statusnya tidak berubah setakat ini, rekod selebihnya sebenarnya berada di negeri pada tarikh tamat rekod dan tidak lagi berada di negeri pada tarikh tamat rekod. Fenomena ini boleh difahami sebagai mengira permulaan tetapi bukan penamat.

Kaedah pelaksanaan jadual zip

1 Tentukan dua jadual sementara, satu untuk data penuh hari itu dan satu lagi untuk data yang perlu ditambah atau dikemas kini; 🎜>

2. Dapatkan jumlah data penuh untuk hari itu
CREATE VOLATILE TABLE VT_xxxx_NEW AS xxxx WITH NO DATA ON COMMIT PRESERVE ROWS;CREATE VOLATILE SET TABLE VT_xxxx_CHG,NO LOG AS xxxx WITH NO DATA ON COMMIT PRESERVE ROWS;
Salin selepas log masuk

3 Ekstrak data baharu atau ditukar, daripada jadual sementara xxxx_CHG
INSERT INTO VT_xxxx_NEW(xx) SELECT (xx,cur_date, max_date) FROM xxxx_sorce;
Salin selepas log masuk

4. Kemas kini jadual sejarah Tarikh_akhir rekod yang tidak sah ialah nilai maksimum
INSERT INTO VT_xxxx_CHG(xx)SELECT xx FROM VT_xxxx_NEWWHERE (xx) NOT IN (select xx from xxxx_HIS where end_date='max_date');
Salin selepas log masuk

5. Masukkan data baharu atau yang diubah ke dalam jadual sasaran
UPDATE A1 FROM xxxx_HIS A1, VT_xxxx_CHG A2SET End_Date='current_date'WHERE A1.xx=A2.xx AND A1.End_Date='max_date';
Salin selepas log masuk

INSERT INTO xxxx_HIS SELECT * FROM VT_xxxx_CHG;
Salin selepas log masuk
Ambil. data produk sebagai contoh

Terdapat jadual produk t_product, struktur jadual adalah seperti berikut:

Nama lajur

列名 类型 说明
goods_id varchar(50) 商品编号
goods_status varchar(50) 商品状态(待审核、待售、在售、已删除)
createtime varchar(50) 商品创建日期
modifytime varchar(50) 商品修改日期
Jenis

Penerangan
goods_id goods_status createtime modifytime
001 待审核 2019-12-20 2019-12-20
002 待售 2019-12-20 2019-12-20
003 在售 2019-12-20 2019-12-20
004 已删除 2019-12-20 2019-12-20
goods_id varchar(50) Nombor item
goods_status varchar(50) Status barangan (menunggu semakan, untuk dijual, dijual, dipadamkan)
createtime varchar(50) Tarikh pembuatan produk
modifytime varchar(50) Tarikh pengubahsuaian produk

Data pada 20 Disember 2019 adalah seperti berikut:

004

goods_id

goods_status

createtime
modifytime
001 Untuk disemak 2019-12-20 td> 2019-12 -20
002 Untuk Dijual 2019- 12-20 2019-12-20
003 Dijual 2019-12-20 2019-12- 20
Dipadamkan 2019-12- 20 2019-12-20
goods_id goods_status createtime modifytime
001 待审核 2019-12-18 2019-12-20
002 待售 2019-12-19 2019-12-20
003 在售 2019-12-20 2019-12-20
004 已删除 2019-12-15 2019-12-20
Status produk akan berubah dari semasa ke semasa simpan maklumat sejarah semua perubahan dalam produk. Pilihan 1: Gambar data setiap hari ke gudang data Pelan ini adalah untuk menyimpan salinan penuh setiap hari dan menyegerakkan semua data ke gudang data Banyak rekod disimpan berulang kali perubahan. 20 Disember (4 keping data)
21 Disember (10 keping data)
goods_id goods_status createtime modifytime
001 Tunggu Semakan 2019-12-18 2019-12-20
002 Untuk Dijual 2019-12-19 2019- 12 -20
003 Dijual 2019 - 12-20 2019-12-20
004 Dipadamkan 2019-12-15 2019-12-20
Dijual2019-12-21006 (produk baharu)
goods_id goods_status createtime modifytime
以下为12月20日快照数据


001 待审核 2019-12-18 2019-12-20
002 待售 2019-12-19 2019-12-20
003 在售 2019-12-20 2019-12-20
004 已删除 2019-12-15 2019-12-20
以下为12月21日快照数据


001 待售(从待审核到待售) 2019-12-18 2019-12-21
002 待售 2019-12-19 2019-12-20
003 在售 2019-12-20 2019-12-20
004 已删除 2019-12-15 2019-12-20
005(新商品) 待审核 2019-12-21 2019-12-21
006(新商品) 待审核 2019-12-21 2019-12-21
goods_id
goods_status createtime modifytime
Berikut ialah data syot kilat pada 20 Disember


001 Semakan belum selesai 2019-12-18 2019-12-20
002 Untuk dijual 2019-12-19 2019-12-20
0032019-12-20 2019-12-20
004 Dipadamkan 2019-12-15 20-12-2019
Berikut ialah data syot kilat pada 21 Disember


001 Untuk dijual (daripada belum selesai kepada belum selesai) 2019-12-18
002 Untuk Dijual 2019-12-19 2019-12-20
003 td> Dijual 20-12-2019 20-12-2019 td>
004 Dipadamkan 2019-12-15 20-12-2019
005 (produk baharu) Kepada disemak 2019-12-21 2019-12-21
Untuk disemak 2019-12-21 21-12-2019
12月22日(18条数据)
goods_id goods_status createtime modifytime
以下为12月20日快照数据


001 待审核 2019-12-18 2019-12-20
002 待售 2019-12-19 2019-12-20
003 在售 2019-12-20 2019-12-20
004 已删除 2019-12-15 2019-12-20
以下为12月21日快照数据


001 待售(从待审核到待售) 2019-12-18 2019-12-21
002 待售 2019-12-19 2019-12-20
003 在售 2019-12-20 2019-12-20
004 已删除 2019-12-15 2019-12-20
005 待审核 2019-12-21 2019-12-21
006 待审核 2019-12-21 2019-12-21
以下为12月22日快照数据


001 待售 2019-12-18 2019-12-21
002 待售 2019-12-19 2019-12-20
003 已删除(从在售到已删除) 2019-12-20 2019-12-22
004 待审核 2019-12-21 2019-12-21
005 待审核 2019-12-21 2019-12-21
006 已删除(从待审核到已删除) 2019-12-21 2019-12-22
007 待审核 2019-12-22 2019-12-22
008 待审核 2019-12-22 2019-12-22
MySQL数仓代码实现

MySQL初始化

在MySQL中 lalian 库和商品表用于到原始数据层

-- 创建数据库create database if not exists lalian;-- 创建商品表create table if not exists `lalian`.`t_product`(
	goods_id varchar(50), -- 商品编号
    goods_status varchar(50), -- 商品状态
    createtime varchar(50), -- 商品创建时间
    modifytime varchar(50) -- 商品修改时间);
Salin selepas log masuk

在MySQL中创建ods和dw层来模拟数仓

-- ods创建商品表create table if not exists `lalian`.`ods_t_product`(
	goods_id varchar(50), -- 商品编号
	goods_status varchar(50), -- 商品状态
	createtime varchar(50), -- 商品创建时间
	modifytime varchar(50), -- 商品修改时间
	cdat varchar(10)   -- 模拟hive分区)default character set = 'utf8';-- dw创建商品表create table if not exists `lalian`.`dw_t_product`(
	goods_id varchar(50), -- 商品编号
	goods_status varchar(50), -- 商品状态
 	createtime varchar(50), -- 商品创建时间
 	modifytime varchar(50), -- 商品修改时间
 	cdat varchar(10)  -- 模拟hive分区)default character set = 'utf8';
Salin selepas log masuk

增量导入12月20号数据

原始数据导入12月20号数据(4条)

insert into `lalian`.`t_product`(goods_id, goods_status, createtime, modifytime) values('001', '待审核', '2019-12-18', '2019-12-20'),('002', '待售', '2019-12-19', '2019-12-20'),('003', '在售', '2019-12-20', '2019-12-20'),('004', '已删除', '2019-12-15', '2019-12-20');
Salin selepas log masuk

注意:由于这里使用的MySQL来模拟的数仓所以直接使用insert into的方式导入数据,在企业中可能会使用hive来做数仓使用 kettle 或者 sqoop 或 datax 等来同步数据。

# 从原始数据层导入到ods 层insert into lalian.ods_t_productselect *,'20191220' from lalian.t_product ;# 从ods同步到dw层insert into lalian.dw_t_productselect * from lalian.ods_t_product where cdat='20191220';
Salin selepas log masuk

查看dw层的运行结果

select * from lalian.dw_t_product where cdat='20191220';
Salin selepas log masuk
goods_id goods_status createtime modifytime cdat
1 待审核 2019/12/18 2019/12/20 20191220
2 待售 2019/12/19 2019/12/20 20191220
3 在售 2019/12/20 2019/12/20 20191220
4 已删除 2019/12/15 2019/12/20 20191220

增量导入12月21数据

原始数据层导入12月21日数据(6条数据)

UPDATE `lalian`.`t_product` SET goods_status = '待售', modifytime = '2019-12-21' WHERE goods_id = '001';
INSERT INTO `lalian`.`t_product`(goods_id, goods_status, createtime, modifytime) VALUES
('005', '待审核', '2019-12-21', '2019-12-21'),
('006', '待审核', '2019-12-21', '2019-12-21');
Salin selepas log masuk

将数据导入到ods层与dw层

# 从原始数据层导入到ods 层insert into lalian.ods_t_productselect *,'20191221' from lalian.t_product ;# 从ods同步到dw层insert into lalian.dw_t_productselect * from lalian.ods_t_product where cdat='20191221';
Salin selepas log masuk

查看dw层的运行结果

select * from lalian.dw_t_product where cdat='20191221';
Salin selepas log masuk
goods_id goods_status createtime modifytime cdat
1 待售 2019/12/18 2019/12/21 20191221
2 待售 2019/12/19 2019/12/20 20191221
3 在售 2019/12/20 2019/12/20 20191221
4 已删除 2019/12/15 2019/12/20 20191221
5 待审核 2019/12/21 2019/12/21 20191221
6 待审核 2019/12/21 2019/12/21 20191221

增量导入12月22日数据

原始数据层导入12月22日数据(6条数据)

UPDATE `lalian`.`t_product` SET goods_status = '已删除', modifytime = '2019-12-22' WHERE goods_id = '003';UPDATE `lalian`.`t_product` SET goods_status = '已删除', modifytime = '2019-12-22' WHERE goods_id = '006';INSERT INTO `lalian`.`t_product`(goods_id, goods_status, createtime, modifytime) VALUES('007', '待审核', '2019-12-22', '2019-12-22'),('008', '待审核', '2019-12-22', '2019-12-22');
Salin selepas log masuk

将数据导入到ods层与dw层

# 从原始数据层导入到ods 层
insert into lalian.ods_t_product
select *,'20191222' from lalian.t_product ;
# 从ods同步到dw层
insert into lalian.dw_t_productpeizhiwenjian
select * from lalian.ods_t_product where cdat='20191222';
Salin selepas log masuk

查看dw层的运行结果

select * from lalian.dw_t_product where cdat='20191222';
Salin selepas log masuk
goods_id goods_status createtime modifytime cdat
1 待售 2019/12/18 2019/12/21 20191222
2 待售 2019/12/19 2019/12/20 20191222
3 已删除 2019/12/20 2019/12/22 20191222
4 已删除 2019/12/15 2019/12/20 20191222
5 待审核 2019/12/21 2019/12/21 20191222
6 已删除 2019/12/21 2019/12/22 20191222
7 待审核 2019/12/22 2019/12/22 20191222
8 待审核 2019/12/22 2019/12/22 20191222

查看dw层的运行结果

select * from lalian.dw_t_product;
Salin selepas log masuk
goods_id goods_status createtime modifytime cdat
1 待审核 2019/12/18 2019/12/20 20191220
2 待售 2019/12/19 2019/12/20 20191220
3 在售 2019/12/20 2019/12/20 20191220
4 已删除 2019/12/15 2019/12/20 20191220
1 待售 2019/12/18 2019/12/21 20191221
2 待售 2019/12/19 2019/12/20 20191221
3 在售 2019/12/20 2019/12/20 20191221
4 已删除 2019/12/15 2019/12/20 20191221
5 待审核 2019/12/21 2019/12/21 20191221
6 待审核 2019/12/21 2019/12/21 20191221
1 待售 2019/12/18 2019/12/21 20191222
2 待售 2019/12/19 2019/12/20 20191222
3 已删除 2019/12/20 2019/12/22 20191222
4 已删除 2019/12/15 2019/12/20 20191222
5 待审核 2019/12/21 2019/12/21 20191222
6 已删除 2019/12/21 2019/12/22 20191222
7 待审核 2019/12/22 2019/12/22 20191222
8 待审核 2019/12/22 2019/12/22 20191222

Daripada kes di atas, kita dapat melihat bahawa jadual mengekalkan volum penuh setiap hari, dan banyak maklumat yang tidak berubah akan disimpan dalam setiap volum penuh Jika jumlah data adalah besar, ia akan menjadi a pembaziran besar storan , meja boleh direka bentuk sebagai jadual zip, yang bukan sahaja dapat mencerminkan status sejarah data, tetapi juga menjimatkan ruang storan ke tahap maksimum.

Pilihan 2: Gunakan jadual zip untuk menyimpan petikan sejarah

Jadual zip tidak menyimpan data berlebihan, hanya 行的数据发生变化,才需要保存下来 tertentu, yang akan menjimatkan ruang storan berbanding penyegerakan penuh setiap kali

Keupayaan untuk menanyakan petikan sejarah

Menambahkan dua lajur tambahan (dw_start_date, dw_end_date) untuk kitaran hayat baris data.

Data jadual zip produk pada 20 Disember
2019-12-15
goods_id goods_status createtime modifytime dw_start_date dw_end_date
001 待审核 2019-12-18 2019-12-20 2019-12-20 9999-12-31
002 待售 2019-12-19 2019-12-20 2019-12-20 9999-12-31
003 在售 2019-12-20 2019-12-20 2019-12-20 9999-12-31
004 已删除 2019-12-15 2019-12-20 2019-12-20 9999-12-31
goods_id

goods_status
  • createtime
  • modifytime
  • dw_start_date
  • dw_end_date
    th >
    001 Semakan belum selesai 2019-12-18 2019-12-20 2019-12-20 9999-12-31
    002 Untuk Dijual 2019-12-19 2019-12-20 2019-12-20 9999-12-31
    003 Tersedia 20-12-2019 20-12-2019 20-12-2019 9999-12-31
    004 Dipadamkan2019-12-20 2019-12-20 9999-12-31
    Data pada 20 Disember ialah data baharu yang diimport ke dalam jadual dw
    goods_id goods_status createtime modifytime dw_start_date dw_end_date
    001 待审核 2019-12-18 2019-12-20 2019-12-20 2019-12-21
    002 待售 2019-12-19 2019-12-20 2019-12-20 9999-12-31
    003 在售 2019-12-20 2019-12-20 2019-12-20 9999-12-31
    004 已删除 2019-12-15 2019-12-20 2019-12-20 9999-12-31
    001(变) 待售 2019-12-18 2019-12-21 2019-12-21 9999-12-31
    005(新) 待审核 2019-12-21 2019-12-21 2019-12-21 9999-12-31
    dw_start_date mewakili masa mula kitaran hayat sekeping data tertentu, iaitu, data itu sah dari masa ini (iaitu tarikh berkesan) dw_end_date mewakili masa tamat kitaran hayat sekeping data tertentu, iaitu, data berakhir di sini Satu hari (tidak termasuk) (iaitu tarikh tamat tempoh) dw_end_date ialah 9999-12-31, yang bermaksud bahawa data semasa ialah data terkini, dan data tidak akan tamat tempoh sehingga 9999-12-31Data jadual zip produk pada 21 Disember tr>9999-12-31
    goods_id goods_status createtime modifytime dw_start_date dw_end_date
    001 Untuk disemak 2019-12 -18 2019-12-20 2019 -12-20 2019-12-21
    002 td> Untuk Dijual 2019-12-19 2019-12-20 20-12-2019
    003 Dijual 2019-12-20 2019-12-20 td> 20-12-2019 9999-12-31
    004 Dipadamkan td> 2019-12-15 2019-12-20 2019-12-20 9999-12-31
    001 (ubah) Untuk Dijual 2019 -12-18 2019-12-21 2019-12 -21 9999-12-31
    005 (baru) Untuk disemak 2019-12 -21 2019-12-21 2019-12-21 9999-12-31

    Tiada data berlebihan yang disimpan dalam jadual zip, iaitu, selagi data tidak berubah, tidak perlu disegerakkan

    • Status data produk bernombor 001 mempunyai ditukar (daripada semakan belum selesai → untuk dijual), yang diperlukan Tukar yang asal dw_end_date dari 9999-12-31 kepada 2019-12-21, menunjukkan status semakan belum selesai, sah dari 2019/12/20 ( termasuk) - 2019/12/21 (eksklusif) ;
    • Status baharu nombor 001 menyimpan semula rekod, dw_start_date ialah 2019/12/21, dw_end_date ialah 9999/12/31;
    • Data baharu 005, 006. dw_start_date ialah 2019/12/21 dan dw_end_date ialah 9999/12/31.
    Data jadual zip produk pada 22 Disember
    9999-12-31Untuk disemak 2019-12-21
    goods_id goods_status createtime modifytime dw_start_date dw_end_date
    001 待审核 2019-12-18 2019-12-20 2019-12-20 2019-12-21
    002 待售 2019-12-19 2019-12-20 2019-12-20 9999-12-31
    003 在售 2019-12-20 2019-12-20 2019-12-20 2019-12-22
    004 已删除 2019-12-15 2019-12-20 2019-12-20 9999-12-31
    001 待售 2019-12-18 2019-12-21 2019-12-21 9999-12-31
    005 待审核 2019-12-21 2019-12-21 2019-12-21 9999-12-31
    006 待审核 2019-12-21 2019-12-21 2019-12-21 9999-12-31
    003(变) 已删除 2019-12-20 2019-12-22 2019-12-22 9999-12-31
    007(新) 待审核 2019-12-22 2019-12-22 2019-12-22 9999-12-31
    008(新) 待审核 2019-12-22 2019-12-22 2019-12-22 9999-12-31
    goods_id
    goods_status createtime modifytime dw_start_date dw_end_date
    001 Untuk disemak 2019-12-18 2019-12-20 2019-12-20 2019-12-21
    002 Untuk Dijual 2019-12-19 2019-12-20 2019-12-20
    003 Dijual 2019-12-20 20-12-2019 2019-12-20 22-12-2019
    004 Dipadamkan 2019-12-15 2019-12-20 2019-12-20 9999-12-31
    001 Untuk dijual 2019-12-18 2019-12-21 2019-12-21 9999-12-31
    0052019-12-21 2019-12-21 2019-12-21 9999-12-31
    006 Untuk disemak 2019-12-21 2019-12-219999-12-31
    003 (ubah) Dipadamkan 2019-12-20 2019-12-22 2019-12-22 mark> mark> 9999-12-31
    007 ( Baharu) Untuk disemak 2019-12-22 22-12-2019 2019-12-22 mark>9999-12-31
    008 ( baru) Untuk disemak 2019-12-22 mark> td>2019-12-22 2019-12-22 9999-12-31

    拉链表中没有存储冗余的数据,即只要数据没有变化,无需同步

    • 003编号的商品数据的状态发生了变化(从在售→已删除),需要将原有的 dw_end_date从9999-12-31变为2019-12-22,表示在售状态,在2019/12/20(包含) - 2019/12/22(不包含) 有效
    • 003编号新的状态重新保存了一条记录,dw_start_date为2019-12-22,dw_end_date为9999-12-31
    • 新数据007、008、dw_start_date为2019-12-22,dw_end_date为9999-12-31
    MySQL数仓拉链表快照实现

    操作流程:

    1. 在原有dw层表上,添加额外的两列
    2. 只同步当天修改的数据到ods层
    3. 拉链表算法实现
    4. 拉链表的数据为:当天最新的数据 UNION ALL 历史数据

    代码实现

    在MySQL中lalian库和商品表用于到原始数据层

    -- 创建数据库create database if not exists lalian;-- 创建商品表create table if not exists `lalian`.`t_product2`(
    	goods_id varchar(50), -- 商品编号
    	goods_status varchar(50), -- 商品状态
        createtime varchar(50), -- 商品创建时间
        modifytime varchar(50) -- 商品修改时间)default character set = 'utf8';
    Salin selepas log masuk

    在MySQL中创建ods和dw层 模拟数仓

    -- ods创建商品表create table if not exists `lalian`.`ods_t_product2`(
    	goods_id varchar(50), -- 商品编号
    	goods_status varchar(50), -- 商品状态
    	createtime varchar(50), -- 商品创建时间
    	modifytime varchar(50), -- 商品修改时间
    	cdat varchar(10)   -- 模拟hive分区)default character set = 'utf8';-- dw创建商品表create table if not exists `lalian`.`dw_t_product2`(
    	goods_id varchar(50), -- 商品编号
    	goods_status varchar(50), -- 商品状态
    	createtime varchar(50), -- 商品创建时间
    	modifytime varchar(50), -- 商品修改时间
    	dw_start_date varchar(12), -- 生效日期
    	dw_end_date varchar(12), -- 失效时间
    	cdat varchar(10)  -- 模拟hive分区)default character set = 'utf8';
    Salin selepas log masuk

    全量导入2019年12月20日数据

    原始数据层导入12月20日数据(4条数据)

    insert into `lalian`.`t_product_2`(goods_id, goods_status, createtime, modifytime) values('001', '待审核', '2019-12-18', '2019-12-20'),('002', '待售', '2019-12-19', '2019-12-20'),('003', '在售', '2019-12-20', '2019-12-20'),('004', '已删除', '2019-12-15', '2019-12-20');
    Salin selepas log masuk

    将数据导入到数仓中的ods层

    insert into lalian.ods_t_product2select *,'20191220' from lalian.t_product2 where modifytime >='2019-12-20';
    Salin selepas log masuk

    将数据从ods层导入到dw层

    insert into lalian.dw_t_product2select goods_id, goods_status, createtime, modifytime, modifytime,'9999-12-31', cdat from lalian.ods_t_product2 where cdat='20191220';
    Salin selepas log masuk

    增量导入2019年12月21日数据

    原始数据层导入12月21日数据(6条数据)

    UPDATE `lalian`.`t_product2` SET goods_status = '待售', modifytime = '2019-12-21' WHERE goods_id = '001';INSERT INTO `lalian`.`t_product2`(goods_id, goods_status, createtime, modifytime) VALUES('005', '待审核', '2019-12-21', '2019-12-21'),('006', '待审核', '2019-12-21', '2019-12-21');
    Salin selepas log masuk

    原始数据层同步到ods层

    insert into lalian.ods_t_product2select *,'20191221' from lalian.t_product2 where modifytime >='2019-12-21';
    Salin selepas log masuk

    编写ods层到dw层重新计算 dw_end_date

    select t1.goods_id, t1.goods_status, t1.createtime, t1.modifytime,
           t1.dw_start_date,
           case when (t2.goods_id is not null and t1.dw_end_date>'2019-12-21') then '2019-12-21'else t1.dw_end_date end as dw_end_date ,
           t1.cdatfrom lalian.dw_t_product2 t1left join (select * from lalian.ods_t_product2 where cdat='20191221')t2 on t1.goods_id=t2.goods_idunionselect goods_id, goods_status, createtime, modifytime, modifytime,'9999-12-31', cdat from lalian.ods_t_product2 where cdat='20191221';
    Salin selepas log masuk

    执行结果如下:

    goods_id goods_status createtime modifytime dw_start_date dw_end_date cdat
    1 待审核 2019-12-18 2019-12-20 2019-12-20 2019-12-21 20191220
    2 待售 2019-12-19 2019-12-20 2019-12-20 9999-12-31 20191220
    3 在售 2019-12-20 2019-12-20 2019-12-20 9999-12-31 20191220
    4 已删除 2019-12-15 2019-12-20 2019-12-20 9999-12-31 20191220
    1 待售 2019-12-18 2019-12-21 2019-12-21 9999-12-31 20191221
    5 待审核 2019-12-21 2019-12-21 2019-12-21 9999-12-31 20191221
    6 待审核 2019-12-21 2019-12-21 2019-12-21 9999-12-31 20191221

    拉链历史表,既能满足反应数据的历史状态,又可以最大程度的节省存储。我们做拉链表的时候要确定拉链表的粒度,比如说拉链表每天只取一个状态,也就是说如果一天有3个状态变更,我们只取最后一个状态,这种天粒度的表其实已经能解决大部分的问题了。

    推荐学习:mysql视频教程

    Atas ialah kandungan terperinci Mari bercakap tentang jadual zip pangkalan data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Label berkaitan:
    sumber:csdn.net
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan