一個(簡化的)Internet書籤數據庫。我覺得這一定是有意義的邏輯組織表,就像這樣:在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」是唯一的ID,整數主鍵)
從標記爲喜歡書籤,我需要選擇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;
該聲明起作用,並且似乎具有足夠的可讀性,但它是否最優?書籤表的目的是平均保存20-50k條記錄(即,不是您的標準瀏覽器書籤管理器:-)應用程序將在啓動時執行3或4條類似語句來填充控件。示例中使用的所有字段都被編入索引。
我在教自己的SQL,並提出了上面的代碼,但也許我忽略了一種語法或可以改善它的成語嗎?
如果收藏指標存儲在用戶表中,那麼推斷出與用戶關聯的所有書籤都是收藏夾 - 它需要位於書籤級別,或者我誤解了目的。 – 2010-11-10 17:23:45
我有一個傾向於在我的問題中過度解釋,所以我編造了一個簡單的例子來避免這個問題。主書籤表將定期更新。在更新期間,我不想觸摸用戶輸入的任何數據,例如評分,標記爲收藏夾等。將兩者分開似乎更爲清晰。同樣,一些用戶可能不想保留歷史記錄,在這種情況下,應用程序可以清除或刪除整個歷史記錄表。 (或者,'用戶'這個名字可能是誤導性的,它不是用戶帳戶數據的表格,而是用戶輸入的數據點,它是一個單用戶桌面應用程序。) – 2010-11-10 22:29:06