Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

SCD loại 3

Dữ liệu về chiều thay đổi chậm hoặc không thể đoán trước được sẽ được ghi lại trong phân tích Kích thước thay đổi chậm (SCD). Trong môi trường kho dữ liệu, bảng thứ nguyên có khóa chính xác định duy nhất từng bản ghi và các phần thông tin khác được gọi là dữ liệu thứ nguyên.

Tất cả các phương pháp cập nhật cho các loại SCD khác nhau có thể được thực hiện bằng cách sử dụng chương trình SortCL trong IRI CoSort. Trong IRI Voracity có một trình hướng dẫn để hỗ trợ tạo các tập lệnh công việc SCD được sử dụng khi chạy chương trình SortCL. Hầu hết các biến thể sử dụng một phép nối bên ngoài đầy đủ để khớp các bản ghi từ nguồn dữ liệu chính ban đầu với các bản ghi trong nguồn được cập nhật dựa trên việc cân bằng một khóa từ mỗi. Hồ sơ với các trận đấu cần được cập nhật trong bản chính. Bản ghi trong nguồn cập nhật không khớp cần được thêm vào bản chính.

Dưới đây là tổng quan về cách cập nhật tệp kích thước bằng SCD Loại 3 mà tôi đang duy trì chi phí sản phẩm. Quá trình cập nhật được thực hiện bằng cách kết hợp với trường Mã sản phẩm .

Loại 3 SCD

Với mô hình Loại 3, dữ liệu hiện tại và dữ liệu lịch sử được lưu trong cùng một bản ghi. Một trong những điều chính cần quyết định là nên lưu giữ bao nhiêu lịch sử. Với ví dụ của chúng tôi, tôi sẽ giữ một chi phí cho ba ngày bắt đầu. Ngày kết thúc là ngày mà chi phí trong hồ sơ không còn hiệu lực. Nếu chi phí vẫn hiệu quả, thì EndDate1 trường sẽ được đặt thành 99991231. Điều này để tránh giá trị trống trong trường này. Dưới đây là các giá trị có trong nguồn chính bắt đầu (master3.dat):

Mã sản phẩm Chi phí 1 StartDate1 Ngày kết thúc1 Chi phí 2 StartDate2 EndDate2 Chi phí 3 StartDate3 EndDate3
C123 125,50 20110228 99991231
F112 2365,00 20120101 99991231
G101 19,25 20110930 99991231 21,25 20110501 20110930
J245 450.50 20110430 99991231 425,25 20101001 20110430 385,25 20100215 20101001
S022 98,75 20110515 99991231

Các bản ghi cập nhật đều có cùng Ngày bắt đầu. Nguồn update.dat chứa các giá trị trường sau cho các bản ghi:

Mã sản phẩm Chi phí Ngày Bắt đầu
F112 2425,00 20120701
J245 550.50 20120701
M447 101,75 20120701
S022 101,75 20120701

Dưới đây là dữ liệu cập nhật. Đối với mỗi bản ghi đã được cập nhật, mỗi chi phí, ngày bắt đầu và ngày kết thúc được chuyển sang bên phải theo một bộ. Trong nhóm hiện tại cũ cho bản ghi, ngày kết thúc được thay đổi thành ngày bắt đầu cho tập hợp hiện tại được cập nhật mới. Mọi giá trị cho bộ thứ ba cũ đều bị loại bỏ.

Mã sản phẩm Chi phí 1 StartDate1 Ngày kết thúc1 Chi phí 2 StartDate2 EndDate2 Chi phí 3 StartDate3 EndDate3
C123 125,50 20110228 9991231
F112 2425,00 20120701 9991231 2365,00 20120101 20120701
G101 19,25 20110930 9991231 21,25 20110501 20110930
J245 550.50 20120701 9991231 450,50 20110430 20120701 425,25 20101001 20110430
M447 101,75 20120701 9991231
S022 101,75 20120701 9991231 98,75 20110515 20120701

Trong IRI Workbench, có một trình hướng dẫn Voracity để hỗ trợ việc tạo các tập lệnh để cập nhật các tệp và bảng Thứ nguyên. Trình hướng dẫn này nằm trong menu thả xuống Voracity trên thanh điều hướng. Đầu tiên, bạn chọn loại SCD. Sau đó, cửa sổ nơi bạn chọn các tệp được sử dụng để xử lý bản cập nhật sẽ hiển thị.

Trong bảng trên cùng trên màn hình tiếp theo, bạn xác định cách dữ liệu đang được cập nhật được ánh xạ tới cái chính. Trong nhóm giữa trên màn hình, hãy chọn các trường cung cấp giá trị trạng thái cho các bản ghi đang được cập nhật.

Trong trình đơn thả xuống bên dưới Hiện tại Bộ trường lịch sử , tập hợp đầu tiên mà bạn xác định, cung cấp tên trường cho các giá trị hiện tại. Trường giá trị là giá trị thứ nguyên đang được cập nhật. Trường bắt đầu là trường xác định khi nào Trường giá trị đã hoạt động và Trường kết thúc xác định khi nó không còn hợp lệ. Sau đó, xác định bao nhiêu tập hợp bạn cần cho số lượng giá trị lịch sử đang được lưu giữ.

Đây là tập lệnh công việc sẽ cập nhật tệp chính:

/INFILE=master3.dat
    /PROCESS=DELIMITED
    /ALIAS=master3
    /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
/INFILE=update.dat
    /PROCESS=DELIMITED
    /ALIAS=update
    /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(COST, TYPE=ASCII, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"')

/JOIN FULL_OUTER master3 update WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master3.dat
# Include only records that are to be updated
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
    /INCLUDE WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master3.dat
# Include only records that are not to be updated
    /PROCESS=DELIMITED
    /FIELD=(MASTER3.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(MASTER3.ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(MASTER3.COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(MASTER3.ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
    /OMIT WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE
    /OMIT WHERE MASTER3.PRODUCTCODE EQ ""
/OUTFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD3/master3.dat
# Add new records
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /INCLUDE WHERE MASTER3.PRODUCTCODE EQ "" AND UPDATE.PRODUCTCODE NE ""

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Một số điều nhanh về phản hồi PASS

  2. API REST Python với Flask, Connexion và SQLAlchemy - Phần 3

  3. Cách phân tích tình trạng của chỉ mục cơ sở dữ liệu

  4. So sánh các đối tượng theo giá trị. Phần 6:Thực hiện Bình đẳng trong Cơ cấu

  5. SQL Injection là gì?