Tiếp tục phần trước, ở bài viết này chúng ta sẽ cùng tìm hiểu các chiến lược kế tiếp để chinh phục Crush (Database của bạn) ❤️
1. Các tips để mò ra “luật ngầm” trong các bảng dữ liệu
Tại sao mình lại nói là “luật ngầm” nhỉ?
Dễ hiểu thôi, nói tới luật ngầm nghĩa là chỉ những người ở thế giới ngầm mới biết được đúng không nè. Vậy người ở thế giới ngầm ở đây là ai? Chính là mấy ông dev đó chứ còn ai nữa 😂
Thiệt luôn đó, sẽ luôn có những luật bất thành văn, những chuyện chưa kể mà chỉ khi bạn đụng phải vấn đề và có nhu cầu thì mới lộ ra thui.
Úi giời, mà lộ ra là một phần nhỏ thôi, lộ ra tới đâu và chính xác tới đâu mới là vấn đề quan tâm và đáng quan ngại đó à nhen. Cách tốt nhất là luôn đặt mình trong tâm thế hiểu nhưng không hiểu để luôn nhận được nhiều góc nhìn nhất từ nhiều người 😂
Tips 1
Uả rồi ngoài cách hỏi ra còn cách nào nữa không nhỉ?
Có luôn bạn ơi, cách tiếp theo là dựa vào lược đồ CSDL và các cờ của từng bảng. Quan trọng hơn hết là chiến lược tìm hiểu nghiệp vụ ở phần trước
Hold up, vậy cuối cùng thì mình cần xác định những gì, dưới đây là danh sách những gì mà bạn cần xác định:
- Khóa chính và Khóa ngoại (phụ)
- Các bảng nằm trong cùng một nghiệp vụ
- Các cờ lọc dữ liệu
- Cấu trúc dữ liệu của bảng có thiết kế dạng gốc và con không? (Tự truy vấn chính mình để ra đủ bộ dữ liệu của cùng một nhóm)
- Cột dữ liệu có bị NULL không? Vd các cột cờ lọc nhưng lại bị NULL thì phải xử lý sao?
- Cột dữ liệu là kiểu dữ liệu nào? Các giá trị đặc trưng là gì
- Nếu bảng con không có đủ dữ liệu metadata cho bảng cha thì phải dùng cách kết bảng như thế nào?
- Đặc biệt là Hạn sử dụng của bảng dữ liệu 😂
Chân kinh là đây
Ủa ông, khóa chính khóa phụ là gì? Cơ bản đó là các cột trong bảng dữ liệu dùng để tạo liên kết với các bảng liên quan. Bạn hiểu giống như việc để cưa đổ Crush thì ngoài việc bạn iu Crush thì Crush cũng phải iu bạn, cả hai đều có chữ “iu” thì cơ hội thành công mới cao. Chứ không thì kết nối lõng lẽo (nó còn chả có kết nối nữa là đằng khác) 😢
Note
Cờ lọc dữ liệu là gì nhỉ? Nó là một cột dữ liệu không liên tục | phân loại | True-False với mục đích duy nhất là lọc dữ liệu theo từng Group | Bin | Nhóm và đặc biệt là vô cùng hiệu quả đối với những bảng có cái tên mỹ miều là “bảng chốt”
Super Note
Bảng chốt là gì? Là bảng sẽ là sự kết hợp của nhiều bảng khác. Lát nữa mình sẽ nói rõ
Nhá hàng
Thật sự thì một lời khó nói hết, trong những video về phân tích kiến trúc của CSDL AdventureWorks mình sẽ đề cập kỹ hơn về từng mục tiêu ở trên, các bạn nhớ đón xem nhen 😎
Còn một công cụ siêu hay và hiệu quả sau đây mà các bạn có thể dùng để tìm hiểu về kiến trúc của bảng dữ liệu
SELECT TOP 1 *
FROM dbo.NameTable WITH (NOLOCK, NOWAIT)Thiệt luôn đó đừng có coi thường hàm SELECT à nhen. Nếu có bảng xếp hạng các hàm dùng nhiều nhất trong SQL thì thể với các bạn chả có hàm nào vượt qua được nó, và thậm chí là người 10 năm kinh nghiệm hay 1 năm kinh nghiệm thì cũng phải dùng hàm này thôi hà 😂
Ủa sao có cục WITH (NOLOCK, NOWAIT) đằng sau nữa? Hiểu đơn giản thì đây là cách để các bạn tăng tốc câu truy vấn. Còn hiểu hơi hơi rõ xíu là sẽ giúp câu truy vấn của bạn không bị Lock (Hold up) khi có quá nhiều người cùng truy vấn vào bảng đó và có những Transaction chưa Commit hay Rollback …
Lưu ý là WITH (NOLOCK, NOWAIT) vẫn có điểm hạn chế là trong nhiều trường hợp nó không đảm bảo tính toàn vẹn của dữ liệu. Ví dụ như nếu câu truy vấn bị Rollback (Quay ngược thời gian) rùi thì dữ liệu lúc đó sẽ không phải dữ liệu thực tế
Super Important
Đối với dân lập trình nói chung và dân Data nói riêng thì NULL hoặc BLANK là những từ rất “rùng mình” 😢
NULL và BLANK nhìn có vẻ giống nhưng chúng vẫn có điểm khác nhau. Trái ngược với BLANK thì NULL nghĩa là không có gì cả (faded) nhưng BLANK thì lại mang ý nghĩa là chuỗi ký tự không có bất kỳ ký tự nào.
Nói cách khác BLANK = Empty String và chỉ xảy ra với các cột có kiểu dữ liệu là chữ mà thui.
Vậy nếu trong trường hợp bạn gặp phải cột NULL thì sẽ thế nào? Có hai giải pháp bạn có thể xử lý đối với cột NULL:
- Tìm cách lấp đầy chỗ còn trống (Giống như trái tim cô đơn của bạn vậy đóoo 😢)
- Tìm cách sống chung với lũ (Đa phần phải chọn cách này)
🎄Nơi nào thiếu nơi đó có NULL
Việc xử lý NULL bằng các giá trị thay thế thường không có một quy chuẩn chung, nhưng có những giải pháp sau:
- Xác định độ quan trọng của cột! Tính chất của cột!
Các bà nội trợ có câu “Mua sắm thông minh”, còn anh em mình cũng nên có slogan riêng “Cày cuốc thông minh”. Đúng vậy, đừng hễ cái gì cũng đè đầu ra mà sửa, mà làm, phải xác định cột này có đáng bỏ công hay không? Tính chất cột này có cho Null được không? Ví dụ cột “Ghi chú” thì có thể Optional đúng không nè nên nó Null là chuyện rất bình thường
NOTE 1
- Thay thế bằng dữ liệu thật: Cách này thường hữu hiệu khi nghiệp vụ siêu rõ ràng chặt chẽ, đồng thời có bảng lưu lại lịch sử nếu cột “dính chưởng” liên quan về giao dịch.
Thông thường mình thấy các case bị “lọt” như vậy chủ yếu dính dáng đến nghiệp vụ chưa lường trước hết các trường hợp đặc biệt nên chúng ta lại quay về bài toán con gà và quả trứng 😂 Vậy nên mọi thứ lúc sẽ là “do User và tùy thuộc User” – Phàm là cái gì để User vẽ vời ra thì dễ chết lắm à nhen!
NOTE 2
- Dùng thuật toán: Mode (Tìm ra thằng nào xuất hiện nhiều nhất thì thay thế) Linear Regression (Mô hình đơn giản nhưng hiệu quả).
Nghe thì xịn đó nhưng mà đối với Database Warehouse dùng để phân tích thì okay nhưng với Database OLAP thì cách này tuyệt đối cần cân nhắc (thậm chí không nên sử dụng)
NOTE 3
Vậy nên việc xử lý NULL cần phải được kiểm soát ngay từ đầu, không nên tới lúc NULL rồi thì mới lo xách quần đi sửa 😢 Đó là lý do tại sao ngay từ lúc tạo bảng đã có cú pháp chống NULL. Ví dụ
CREATE TABLE Persons (ID int NOT NULL)🎄Sống chung với lũ…Nhưng không ai yêu chung một người nha 😂 Hại người lắm
Okay, giải pháp đầu nếu toang quá thì còn cách là chấp nhận hiện thật và tìm cách chấp vá thui.
Sẽ có hai trường hợp một cột là NULL (Tất nhiên cột khóa chính và khóa phụ bắt buộc có dữ liệu rùi).
- Đầu tiên là cột đó là loại cột Cờ lọc dữ liệu, ta sẽ dùng hàm sau:
ISNULL(dbo.FlagColumn, 0) = 0Như mình nói, chỉ những cột mang ý nghĩa Cờ lọc thì mới dùng được cách này vì cột này chỉ có hai giá trị True và False (Cột có kiểu dữ liệu bit). Như vậy ta sẽ hàm định là NULL sẽ là 0Note
Vì sao tự hàm định NULL là 0, cái này là kỹ thuật tâm lý à nhen: Rõ ràng chúng ta chỉ quan tâm tới những gì được đánh giá là tốt đúng không? giữa True và False thì người ta sẽ chỉ thích True đúng không nè? Giống như việc bạn hỏi người yêu hay Crush yêu mình đúng không thì câu trả lời bạn muốn là gì?
Yes, đó là lý do ví dụ trong 1 Form nhập liệu có hai tick True và False thì nếu nó False thì người ta sẽ thường bỏ qua 😂Còn nếu nó là trường hợp đặc biệt ví dụ Cursh bạn thích bạn thì mới bật cờ True
Crush và True
- Trường hợp thứ hai là cột đó thường là cột ngày tháng hoặc là cột phân loại. Ta sẽ dùng cách này
CASE
WHEN <Condition1> THEN <Result1>
ELSE <Resutl2>
ENDThường thì cách này hữu hiệu khi có một cột thay thế, hoặc về cơ bản là sẽ phải phát triển thêm một cột mới với nghiệp vụ rõ ràng và kỹ lưỡng hơn (hoặc bổ sung nghiệp vụ) và ta sẽ lấy cột đầu tiên không NULL.
Ta còn một cách thủ công khác, hơi trầy trật nhưng hiệu quả không kém
Cách này dùng khi ta biết quá rõ các trường hợp có thể xảy ra, thường chỉ áp dụng cho cột phân loại.
Con cũng là cha, mà cha cũng là con
Bạn đã bao giờ thấy hình ảnh lược đồ sau đây chưa

Hình trên có nghĩa là tự bảng Orders nối với chính nó. Uả sao lại có thiết kế kì dị tới vậy?
Chuyện là theo cách nghĩ thông thường ví dụ như ta có một hóa đơn chính thì ta sẽ lưu vào bảng Orders đúng chứ? Rùi ví dụ cùng người mua đó muốn mua thêm nhưng hóa đơn chính ra rùi vậy nếu xuất thêm các hóa đơn khác cho nhu cầu phát sinh thì sẽ không xác định được là người này mua hàng trong cùng một đợt hay là của nhiều lần tới lui khác nhau!
Câu chuyện trên dẫn tới việc phải có một cái group xác định đợt mua hàng của người đó. Với cách thông thường trong thiết kế bảng CSDL ta sẽ dùng bảng con để lưu các hóa đơn con còn bảng cha sẽ lưu các hóa đơn gốc. Nhưng với cách này có một vấn để là ta có tới hai bảng Orders cần quản lý, thiếu sự tập trung mặc dù về cấu trúc của cả hai bảng đều y xì nhau vì đều có các cột giống nhau. Về phần hiệu năng thì ít hay nhiều thì cũng sẽ có ảnh hưởng nhất định.
Chính vì thế thiết kế là cách xử lý cho vấn đề trên.
SELECT *
FROM dbo.Orders ord1 WITH(NOLOCK, NOWAIT)
JOIN dbo.Orders ord2 WITH(NOLOCK, NOWAIT)
ON ord1.ordergroup_id = ord2.ordergroup_id
AND ord1.order_sort = 1Chỗ nào không hiểu thì comment hỏi mình hen 😎
Luôn kiểm tra hạn sử dụng
Tưởng đùa chứ thiệt á, nhiều khi lỗi sai không phải là Logic hay là lũng lỗ nghiệp vụ mà do bảng đã “Không còn dùng nữa em ơi”.
Nghe mà sốc tâm lý nhẹ luôn á mọi người 😂 Mình từng bị trường hợp như này vài lần rùi nè. Vậy nên vẫn quan trọng nhất là các bạn cần phải hỏi nè
2. Kết luận
Bài viết này đã tổng kết xong chiến thuật thứ 3 về cách chinh phục Crush (AdventureWorks). Ở bài tiếp theo mình sẽ đề cập tới chiến thuật cuối cùng tại sao lại ra đời và làm sao thực hành
Lưu ý là các bạn siêu siêu nên coi Video mình làm vì Video sẽ trực quan hơn. Cứ click vào icon Youtube là sẽ được đẩy sang Youtube à 😂

