2011-04-16 141 views
0

我想要完成的任務:模型+數據庫設計

  • 圖片應該是單獨或者專輯
  • 瀏覽的相冊和配頁單張照片編號
  • 不就表明內部專輯圖片列表瀏覽,只是專輯封面

我的做法迄今已有:

  • 模型表示一個單一的圖像,並且單個專輯
  • 一個數據庫表中的內容包含ID,標題,thumbnailFile和鏡像文件等
  • 一個數據庫表專輯相冊ID,相冊標題等
  • 一個數據庫表album_content映射哪些內容是裏面有什麼專輯
  • 一個數據庫表的瀏覽與使用縮略圖預覽和排序(文件名,標題,視圖,日期等),IDS的專輯,和IDS的內容不是內部專輯+複製屬性
  • Paginator僅利用後者表格,而視圖正在使用mo刪除指向內容表

我不認爲上面是關於速度太差,但我不覺得它特別優雅,我正在尋找一個更好的方式來做到這一點,並希望收縮要緩存/無效的元素數量。到目前爲止,我一直線沿線的思考的東西:

  1. 只有其數據庫中的數據的一個副本(合併內容,專輯和瀏覽不知何故,仍然能夠quicly數和日期排序的數據集,意見等)
  2. 走就走由列在任何可排序/順序加入
  3. 對待所有圖像作爲一個單一的模型實例,也在裏面專輯

我在這裏的主要問題是,專輯有日期,意見等等,不管它裏面的內容是什麼,我希望按照續約日期排序不在專輯內+專輯的日期應該有一個唯一的標識符。專輯也有colums與內容無關。

有沒有解決這個問題的好方法?

* 編輯:爲了速度,我覺得我堅持單獨的瀏覽表。有沒有辦法讓Zend dbTable引用瀏覽< - >專輯和內容的視圖列,以便專輯或內容中的onUpdate正在利用Zend中的CASCADE邏輯更新兩個表?

+0

圖像是否可以出現在多個相冊中?一張圖像既可以是單曲,也可以是專輯?一張圖像可以在同一張專輯中多次出現?專輯可以沒有圖像嗎?你想在同一個列表中瀏覽單張圖片和相冊嗎? – Skrol29 2011-04-19 08:48:26

回答

2

我會在後臺編碼:1張單張圖片= 1張專輯類型爲單曲。因此瀏覽單個圖像與瀏覽相冊相同。唯一的區別是當您顯示「單張圖像」相冊或「正常」相冊時。 這使得sens,因爲專輯和單幅圖像都有一個圖像代表內容(圖像或封面)。

表可以是這樣的:

t_album (id, type, title, cover_id, ...) 
t_image (id, link, thumbnail_id, ...) 
t_album_contents (id_album, id_image, comments) 

注意,表[t_album_contents]是必要的,如果只有一個圖像可以是在數張專輯,或者可以是在同一個專輯數次。否則,該表可能會消失,並用表[t_image]中的[t_album]上的外鍵代替。

0

這是百達一個好主意,堅持規範化的數據庫(3NF)第一,並根據您使用DBMS的做運行時優化(3NF違反僅如果你需要的話)......

再次,我不能清楚地說明這一點:避免以任何可接受的代價違反3NF

如果您添加了違反3NF的內容,請確保數據庫的3NF部分在每種可能的情況下都保持完好無損。您的冗餘「複製屬性」可能導致數據不一致,因此請確保模型中無冗餘冗餘3NF部分的數據具有優先級。當服務器負載允許時,規則地從3NF部分重建冗餘部分,或者提供經過測試的更新模式,確保更新僅適用於3NF部分,並且3NF部分的每個更新都會觸發重建相應的冗餘數據。像這樣的方法試圖最大限度地減少數據損壞的風險,當你需要冗餘數據時,從數據庫中讀取性能等原因,同時從數據庫中讀取數據庫的3NF部分與其他部分分離(命名空間/前綴/ etc)

根據預期的請求(瀏覽請求的數量與更新/插入請求的數量),使用您的建議方法和冗餘數據是否合理。當涉及到速度時,請不要低估正確的表格索引。

用於比較(排序)的專輯與其他內容混合的問題:

爲什麼不能內容實體代表的相冊?一張專輯就像一個目錄......它可能有子目錄,它們將從目錄的角度來看是內容...如果它是用這種方式建模的話,你可以將內容與內容進行比較......額外的屬性,取決於具體的內容類型在1:0-1關係的另一個表中,而「常見的」可比較的屬性存在於內容表

另一方面,你可以使用聯合vor這將理想情況下只會慢一點,但可以使這兩種類型的統一的實體,這取決於預期的請求,它可能是有意義的緩存與分類結果對每個瀏覽的對象進行比較和排序...

我希望這有助於有點

+0

我嘗試過使用聯合方法,因爲數據庫在對數據集進行排序(如對其他表中的數據進行排序)之前爲數據庫創建臨時表,所以這種聯合方法速度要慢得多。我的瀏覽表或多或少是這個臨時表的存儲版本。 我看了一下關於觸發器的mysql,但我不確定這是否是一個很好的方法來更新這個瀏覽表,保持邏輯脫離我的模型 – 2011-04-16 16:23:03

+0

所以你的DBMS是MySQL ......如果你想要保持緩存更新邏輯靠近數據庫,您應該考慮處理更新和插入案例的存儲過程......讀取時,您的應用程序邏輯可以簡單地使用緩存表(這可以在數據不一致的情況下輕鬆地重建) ),如果需要,也可以訪問標準化數據...因爲更新和插入僅限於存儲過程,所以關於緩存更新只有一點需要注意 – DarkSquirrel42 2011-04-16 18:22:02