Data Engineering Project — Cửa hàng bán lẻ phần 2 — Loading the Data
Mở đầu
Đây là phần 2 của "Data Engineering Project - Cửa hàng bán lẻ" series. Sau khi thu được dữ liệu rượu whisky ở phần 1, bước tiếp theo là thiết kế đường dẫn ETL và load dữ liệu vào cơ sở dữ liệu trung tâm của tổ chức.
Các bước của project
1. Tạo ra dữ liệu random
Trong phần này, tôi sẽ sử dụng Python để tạo ra dữ liệu random của đa dạng các phần của tổ chức.
2. Thiết kế Central RDBMS và thực hiện chuẩn hóa
3. Load dữ liệu vào central RDMBS.
Phần đầu của chuỗi series đã tập trung vào việc trích xuất dữ liệu sản phẩm. Tại thời điểm này, tôi đã có 1 dataframe chứa toàn bộ dữ liệu về whiskey mà tôi đã lấy từ website https://www.thewhiskyexchange.com/.
Bạn có thể xem lại phần 1 của series ở đây: Data Engineering Project — Cửa hàng bán lẻ phần 1 — Web Scraping (dungloquang.blogspot.com)
Với mục đích nhắc lại, đây là nơi tôi đã dừng lại ở phần trước.
Step #1 -- Tạo dữ liệu random
Đầu tiên, tôi sẽ tạo ra dữ liệu về nhân viên, khách hàng, hóa đơn và sản phẩm.
Import các thư viện và functions cần thiết
Đầu tiên, tôi sẽ load file csv chứa dữ liệu về sản phẩm mà tôi đã trích xuất được ở phần 1 vào 1 dataframe.
Tiếp theo, tôi sẽ tạo ra 1 cột product ids. Đây sẽ được coi như là khóa chính của bảng products.
Hãy cùng xem thử qua dataframe mà ta mới tạo.
2. Tạo ra dữ liệu về nhân viên
4. Tạo ra dữ liệu về hóa đơn
Sau khi tạo ra các dữ liệu random, tôi có thể bắt đầu thiết kế central database. Database sẽ đóng vai trò như là nguồn dữ liệu chính của tổ chức và như vậy chúng sẽ phấn đấu để tối ưu hóa tính nhất quán và toàn vẹn của dữ liệu nằm bên trong database.
Tôi sẽ chuẩn hóa từng bảng để thỏa mãn từ 1NF cho đến 3NF.
Tôi cũng sẽ chuẩn hóa các bảng bằng Python trước cho đến khi mọi thứ ok rồi mới đưa vào bên trong database.
Database hiện tại trông sẽ như thế này:
Chuẩn hóa các bảng
Hiện tại tôi đã tạo ra được các bảng chưa chuẩn hóa, tôi có thể chuẩn hóa chúng để thỏa mãn điều kiện 3 normalized form hay 3NF.
Hãy cùng xem qua những điều kiện của từng normalized form nhé:
First Normalized Form (1NF)
1. Mỗi dòng dữ liệu phải là duy nhất.
2. Mỗi ô dữ liệu có thể bao gồm 1 giá trị duy nhất.
Second Normalized Form (2NF)
1. Bảng phải thỏa mãn điều kiện của 1NF.
2. Bảng phải được tách biệt khỏi các giá trị lặp lại áp dụng cho nhiều hàng.
Third Normalized Form (3NF)
1. Bảng phải thỏa mãn điều kiện của 2NF.
2. Mỗi thực thể cần được xác định chỉ bởi khóa chính.
1. Chuẩn hóa bảng khách hàng
Tôi sẽ bắt đầu bằng việc chuẩn hóa bảng khách hàng. Hãy bắt đầu bằng việc check xem liệu bảng có đạt tiêu chuẩn 1NF hay không.
1NF
Tại thời điểm hiện tại, từng hàng dữ liệu là duy nhất và từng ô dữ liệu chỉ chứa duy nhất 1 giá trị, vì vậy bảng đã thỏa mãn điều kiện của 1NF.
2NF
Yêu cầu đối với dạng chuẩn thứ 2 là tách các nhóm giá trị áp dụng cho nhiều hàng.
Ví dụ: country, country_code và credit_providers không có nhiều số lượng và áp dụng cho nhiều hàng. Đây là 1 ví dụ về sự dư thừa dữ liệu trong bảng.
Tôi sẽ tạo thêm 3 bảng riêng từ bảng này để thỏa mãn điều kiện 2NF.
Bảng đầu tiên - Countries
Sau khi tạo ra 1 bảng mới tôi cần kết nối nó với bảng khách hàng, để làm được điều đó tôi cần tạo ra 1 khóa ngoại gọi là country_ids.
Bây giờ tôi có thể loại bỏ cột country và country_code ra khỏi bảng khách hàng mà không làm mất mát dữ liệu.
Done! Hãy tiếp tục bằng việc phân tách bảng khách hàng, tôi sẽ tạo 1 bảng gọi là customer_cc để lưu trữ thông tin về credit card providers của khách hàng.
Bảng thứ 2 - Customer_cc
Như phần trước, tôi cần kết nối nó với bảng khách hàng. Hãy cùng tạo 1 khóa ngoại tên là credit_provider_id.
Giờ tôi có thể loại bỏ cột credit_provider trong bảng khách hàng.
Và giờ bảng khách hàng đã ở dạng chuẩn 2NF. Cùng xem database hiện giờ trông như thế nào:
3NF
Giờ hãy check xem liệu bảng khách hàng có thỏa mãn điều kiện của dạng chuẩn 3NF không.
Điều kiện để đạt dạng chuẩn 3NF là mỗi cột chỉ phụ thuộc vào khóa chính. Trong trường hợp này, khóa chính là customer_id. Để biết được rằng mỗi cột chỉ phụ thuộc vào khóa chính hay không ta sẽ tự đặt ra 1 số câu hỏi.
Q1. "Với 1 khóa chính, tôi có thể thể cho biết được giá trị của cột đó không?"
Nếu câu trả lời là có thì chúng ta sẽ chuyển sang câu hỏi thứ 2.
Q2. "Với bất kỳ cột nào khác, tôi có thể cho biết giá trị của cột đó không?"
Nếu câu trả lời là không thì chúng ta có thể tự tin cho rằng cột đó chỉ phụ thuộc vào duy nhất khóa chính.
Ví dụ: Hãy cùng check xem liệu cột first_name chỉ phụ thuộc vào duy nhất khóa chính không. Cùng đưa ra câu hỏi như sau:
Q1. Dựa vào customer_id, tôi có thể biết được tên của khách hàng?
Trả lời: Đúng. Biết được customer id có thể xác định được tên của khách hàng.
Q2. Dựa vào bất kỳ cột nào khác, tôi có thể biết được tên của khách hàng?
Trả lời: Sai. Khi nhìn vào last name, country hoặc bất kỳ cột nào, tôi không thể xác định được tên của khách hàng. Có nhiều người có thể trùng họ tên và cùng quốc gia.
Vậy ta có thể kết luận rằng: cột first_name không thuộc về bảng đó, với điều kiện tôi định chuẩn hóa bảng khách hàng lên 3NF.
2. Chuẩn hóa bảng nhân viên
Hãy cùng làm quá trình tương tự đối với bảng nhân viên. Hiện tại bảng nhân viên đang trông như thế này:
1NF
Giống như phần trước, mỗi dòng dữ liệu là duy nhất và mỗi ô dữ liệu chỉ chứa 1 giá trị duy nhất nên đã thỏa mãn điều kiện chuẩn 1NF.
2NF
Để kiểm tra các yêu cầu của 2NF, hãy hỏi liệu bảng này có các giá trị áp dụng cho nhiều hàng hay không?Có. cột Department có chứa giá trị bị lặp lại.
Ở đây chỉ có 4 giá trị department, cột này khiến dữ liệu bị dư thừa. Cùng chia bảng này thành 2 bảng: bảng nhân viên và bảng department.
departments table
Bảng mới sẽ trông như thế này:
Sau khi tạo ra bảng mới, tôi cần kết nối nó với bảng nhân viên. Như trước kia, tôi sẽ tạo 1 khóa ngoại để kết nối chúng.
Giờ tôi có thể drop cột department ra khỏi bảng nhân viên
Vậy là đã đạt chuẩn 2NF. Cùng xem điều kiện 3NF là gì nhé!
3NF
Bảng nhân viên hiện tại trông như thế này:Như bạn đã thấy, mỗi cột chỉ phụ thuộc duy nhất vào khóa chính là employee_id, vì vậy bảng này đã thỏa mãn điều kiện chuẩn 3NF.
Tôi đã chuẩn hóa phần còn lại của cơ sở dữ liệu bằng cách sử dụng các nguyên tắc tương tự. Đây là cơ sở dữ liệu mới sau khi được chuẩn hóa:
Nhắc nhở: Các bước cho đến bây giờ chỉ được thực hiện bởi Python. Bây giờ các bảng đã được chuẩn hóa, hãy kết nối với cơ sở dữ liệu và tải dữ liệu theo thiết kế của tôi. Công cụ tôi đã sử dụng làm cơ sở dữ liệu của mình là MySql.
Step #3 -- Load dữ liệu vào central RDBMS
1. Kết nối Python với MySQL
2. Tạo schema mới
3. Tạo empty tables
Đầu tiên, tôi sẽ bắt đầu với các bảng không có khóa ngoại như bảng: countries, customer_cc, products và departments.
Countries
Customer_cc
Products
Departments
Giờ tôi có thể tạo các bảng còn lại như bảng: khách hàng, nhân viên và hóa đơn.
Customers
Employees
Payments
4. Điền dữ liệu vào các bảng
Để chèn dataframe mà tôi vừa tạo bằng Python vào MySQL, tôi phải biến đổi chúng. Tôi sẽ chuyển đổi từng bảng thành 1 bộ và sẽ chèn từng hàng 1 bằng cách sử dụng vòng lặp for. Tôi sẽ cam kết toàn bộ quá trình khi vòng lặp kết thúc.
Countries
Trước khi điền dữ liệu vào các bảng còn lại, tôi muốn show quá trình trông như thế nào trong MySQL.
Hãy cùng thử 1 câu truy vấn đơn giản để xem dữ liệu mà tôi đã chuyển từ Python vào MySQL.
Sau khi điền dữ liệu cho các bảng còn lại, tôi sẽ chỉ sử dụng MySQL khi tôi làm việc với dữ liệu. Đó là điểm cần lưu ý trong phần này của project, để lưu trữ dữ liệu trong 1 công cụ được thiết kế để truy vấn dữ liệu như MySQL.
Hãy tiếp tục với các bảng còn lại. Tôi sẽ làm tương tự bước trên cho các bảng còn lại.
Customer_cc
Products
Departments
Customers
Employees
Payments
Giờ toàn bộ dữ liệu đã được lưu trữ trong MySQL ở dạng schema chuẩn hóa có thể được sử dụng để truy vấn và thu được dữ liệu. Hãy cùng tạo ERD diagram bằng MySQL để thấy được schema hoàn chỉnh.
Và đó là toàn bộ cho phần 2 của series.
Trong phần 3, tôi sẽ thiết kế 1 data warehouse mà tổ chức sẽ sử dụng làm nguồn chính dữ liệu, được sử dụng cho mục đích phân tích và hỗ trợ ra quyết định và các báo cáo.
See yahh <3
Comments
Post a Comment