Tôi có một bảng đang làm việc với cùng một loại, rất nhiều cột và 1000 cách khác nhau để chọn. Nó là một cơn ác mộng. Tuy nhiên, tôi đã tìm thấy, có một số tổ hợp bộ lọc được sử dụng thường xuyên. Đó là những cái tôi sẽ tạo chỉ mục và để lại những cái khác hiếm khi được sử dụng để chạy chậm. Trong MSSQL, tôi có thể chạy một truy vấn để hiển thị cho tôi những truy vấn đắt nhất đã được chạy trên cơ sở dữ liệu, mySQL cũng nên có một thứ tương tự. Khi tôi có chúng, tôi tạo một chỉ mục bao gồm các cột để tăng tốc chúng. Cuối cùng, bạn sẽ có nó được bảo hiểm 90 phần trăm. Cá nhân tôi sẽ không bao giờ thiết kế một chiếc bàn như vậy nữa trừ khi có khẩu AK47 chĩa vào người. (các chỉ mục của tôi lớn hơn 3 lần so với dữ liệu trong bảng, điều này rất khó hiểu nếu bạn cần thêm một nhóm hoặc bản ghi). Tôi không chắc mình sẽ thiết kế lại bảng như thế nào, suy nghĩ đầu tiên của tôi là chia bảng thành hai , nhưng điều đó sẽ gây thêm đau đầu ở những nơi khác.
Bảng Người dùng (UserID, Tên)
1, Lisa
2, Jane
3, John
Bảng thuộc tính người dùng (UserID, AttributeName, AttributeValue)
1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3 EYES, Blue
3, GENDER, Male
Điều này sẽ làm cho việc xác định các thuộc tính nhanh hơn, nhưng làm cho các truy vấn của bạn không dễ viết.
SELECT UserID, COUNT(*) as MatchingAttributes
FROM UserAttributes
WHERE (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
(UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female')
Điều này sẽ trả về như sau
UserID, MatchingAttributes
1, 1
2, 2
3, 1
Tất cả những gì bạn cần làm sau đó là thêm HAVING COUNT (*) =2 vào truy vấn để chỉ chọn các ID phù hợp. Nó có liên quan nhiều hơn một chút để lựa chọn, nhưng nó cũng cung cấp một tính năng gọn gàng, Giả sử bạn lọc trên 10 Thuộc tính và trả về tất cả những thuộc tính có 10 phù hợp. Tuyệt vời, nhưng nói rằng không có cái nào phù hợp 100%. Bạn có thể nói này, tôi không tìm thấy cái nào phù hợp, nhưng chúng có 9/10 hoặc 90% trùng khớp. (chỉ cần đảm bảo rằng, nếu tôi tìm kiếm một cô gái tóc vàng mắt xanh, tôi sẽ không nhận được thông báo rằng không tìm thấy ở đâu nhưng đây là những người phù hợp nhất tiếp theo có chứa những cô gái tóc vàng mắt xanh với điểm số trùng khớp là 60%. Điều đó sẽ hãy rất thô lỗ)
Có nhiều điều cần xem xét hơn nếu bạn chọn tách bảng, chẳng hạn như làm cách nào để bạn lưu trữ các thuộc tính dưới dạng số, ngày tháng và văn bản trong một cột duy nhất? Hoặc là những bảng, hoặc cột riêng biệt. Không có câu trả lời dễ dàng cho cả bảng rộng hay bảng chia nhỏ.