Cũng xin trao đổi thêm về vấn đề thiết kế CSDL để tôi cũng như các ace mới rộng đường học hỏi.
Tôi thì chỉ rãnh rỗi ngồi tập tành viết ứng dụng nhỏ cho thõa đam mê thôi chứ chưa có làm cái phần mềm nào lớn với cái database mấy trăm ngàn record cả nên cũng chưa trải nghiệm tốc độ khi thiết kế table và relationship.
Vấn đề bàn luận ở trên có thể tóm gọn trong cái ý là: nên sử dụng left join nhiều table hay gộp chung vô 1 table với nhiều cột, chuẩn hoá hay không chuẩn hoá (có cố ý).
Về cơ bản tôi nghĩ đối với người mới thì phải biết cách chuẩn hoá CSLD đã rồi mới đi tới tinh chỉnh CSDL theo cách không chuẩn hoá (denormalized) có cố ý, giống như Trương Vô Kỵ phải học hết các chiêu Thái cực quyền rồi mới luyện tới mức quên hết không còn chiêu gì cả...
.
Việc chọn cách thiết kế chuẩn hoá, không chuẩn hoá hay kết hợp thì phải dựa vào thực tế CSDL và kinh nghiệm nên tôi cũng không nói phải chọn một vì mỗi cách sẽ có mặt lợi, mặt hại tuỳ CSDL và yêu cầu thực tế. Việc sử dụng Join table không phải luôn luôn là tốt và ngược lại. Ví dụ: (lý thuyết)
* Đối với CSDL chuẩn hóa:
- Mặt lợi là:
+ Tránh dữ liệu bị dư thừa (lưu nhiều nơi).
+ Dễ bảo trì. Khi cần sửa, xóa, thêm cột... chỉ cần thực hiện trên 1 dòng, 1 table
+ VD: tblNhanVien có lưu mã phòng ban. tblPhongBan có mã PB, tên phòng ban, quản lý trên/dưới trực tiếp...Khi có thay đổi các thông tin phòng ban thì chỉ cần cập nhật trong tblPhongBan là đủ rồi.
- Mặt không thuận lợi: là như bạn nói sẽ tốn RAM, CPU cho việc query join (trăm ngàn record).
* Đối với CSDL denormalized:
- Mặt lợi: là tốc độ truy vấn.
- Không lợi: là khi cần cập nhật phải cập nhật cho tất cả các dòng record, các table có lưu cùng 1 thông tin.
Do vậy theo tôi nghĩ việc chọn normalize, denormalize hay kết hợp tùy thuộc vào nhu cầu query dữ liệu nào trong form, trong ứng dụng, qui mô của ứng dụng cũng như kiến thức bản thân để tinh chỉnh CSLD. Tôi sẽ chọn join table cho các dữ liệu thường thay đổi và khi query cần ít join.
Trên đây là một số ý kiến cá nhân, các bạn đã kinh nghiệm qua thì cùng chia sẽ thêm.