Cơ sở dữ liệu dấu trang (đã được đơn giản hóa). Tôi nghĩ rằng nó sẽ làm cho tinh thần để tổ chức các bảng một cách logic, như vậy:Cách tối ưu để tham gia ba bảng trong SQLite
Bookmarks (id, title, url; basically external data)
+------+------------+-----+
| suid | Title | ... |
+------+------------+-----+
User (user-specific data: favorites, ratings, etc)
+------+------------+-----+
| suid | IsFavorite | ... |
+ + (0 or 1) + +
+------+------------+-----+
History (last used, use count etc)
+------+------------+-----+
| suid | LastUsed | ... |
+ +(TDateTime) + +
+------+------------+-----+
('suid' là ID duy nhất, nguyên sơ cấp key)
Từ bookmark gắn cờ là yêu thích tôi cần phải chọn N được sử dụng gần đây nhất (để điền trình đơn vào thời gian chạy khi thuận tiện).
SELECT Bookmarks.suid, Title from Bookmarks
INNER JOIN User USING (suid)
INNER JOIN History USING (suid)
WHERE IsFavorite = 1
ORDER BY LastUsed DESC
LIMIT 15;
Tuyên bố hoạt động và có vẻ dễ đọc, nhưng tối ưu? Bảng Dấu trang nhằm mục đích giữ trung bình 20-50 nghìn bản ghi (nghĩa là không phải trình quản lý dấu trang trình duyệt chuẩn của bạn :-) Ứng dụng sẽ thực thi 3 hoặc 4 câu lệnh tương tự khi khởi động để điền các điều khiển. Tất cả các trường được sử dụng trong ví dụ đều được lập chỉ mục.
Tôi tự dạy SQL và đưa ra mã trên, nhưng có lẽ tôi đang xem một cú pháp hoặc thành ngữ có thể cải thiện nó?
Nếu chỉ báo ưa thích được lưu trữ trong bảng người dùng, điều đó sẽ suy ra rằng tất cả dấu trang được liên kết với người dùng là mục yêu thích - cần phải ở cấp đánh dấu hoặc tôi hiểu sai mục đích. –
Tôi có xu hướng giải thích quá mức trong các câu hỏi của mình, vì vậy tôi đã pha chế một ví dụ đơn giản về xương trần để tránh điều đó. Bảng đánh dấu chính sẽ được cập nhật định kỳ. Trong quá trình cập nhật, tôi không muốn chạm vào bất kỳ dữ liệu nào mà người dùng đã nhập, như xếp hạng, đánh dấu là mục yêu thích, v.v. Tương tự như vậy, một số người dùng có thể không muốn duy trì lịch sử, trong trường hợp đó ứng dụng chỉ có thể xóa hoặc xóa toàn bộ bảng lịch sử. (Hoặc, có lẽ cái tên 'Người dùng' là gây hiểu lầm. Nó không phải là một bảng cho dữ liệu tài khoản người dùng, nhưng đối với các điểm dữ liệu được người dùng nhập vào. Đó là ứng dụng dành cho máy tính để bàn một người dùng.) –