2012-01-26 44 views
11

我正在做一個網站,有不同類型的項目,如博客,帖子,文章等。用戶可以將他們中的任何一個設置爲他/她的最愛。現在,當我處理這件事,我有兩個選擇數據庫設計:多個表對一個表

  1. 做一個表,用戶喜愛爲每種類型的對象。
  2. 爲所有用戶的所有類型的對象建立一個公用表。

,由第1結構的問題是,我將不得不查詢大量的表,用於顯示特定用戶的最愛。但它可以讓我輕鬆地將收藏夾分成不同的類別。

但是,如果我必須在單個頁面上顯示所有收藏夾並將它們全部合併,並根據時間進行排序,那麼這會變得困難。但是如果我使用第二個模型,我可以輕鬆獲得最新的收藏夾,並根據對象類型對它們進行分組並不困難,但是我將擁有一個大型表格站點。

這兩種策略中的哪一種會更具可擴展性。

的第一一個需要多個數據庫查詢,而第二個 需要一個大的單一的表。

如果有幫助,我使用MySql

+0

#2,如果表是正確的索引針對一個大表查詢的性能應該是相似的#1。 –

回答

8

看來你已經知道答案,但要記住,讓你設計簡單的修改作爲商業模式的系統總是隨着時間而改變或他們最終失敗(這是一個概括,但你的想法)。這方面的一個推論是,如果你犯了一個僵化模式,或快或慢,它的剛性,變化將更加努力,最終用戶將無法看到其中的差別,因此沒有錢/幸福的變革得以實現,除非它是一個非常糟糕的變化。 您的問題不是技術的方式查詢工作在一個哲學之一的引擎,但更多的,容易改變與明顯的速度。 問問自己,擁有規範化數據庫有什麼優勢?考慮一個乾淨的架構和設計,性能是當今世界最少的問題,因爲處理更便宜,而且存儲也是如此。但設計昂貴。規範化是爲了使系統不依賴於最後時刻的決定,而是依賴於結構化設計過程。 大表是不是一個大問題MySQL,但他們是一個大問題,以維護,修改和擴充。這不僅僅是增加一列,而是關於數據本身的嚴格結構。最終,您只需添加包含索引的列,並且這些索引將指向小表。無論如何,MySql將會解決所有這些數據的問題。 所以我會去第一個,很多小桌子,多對多。

4

我有我的網站上這樣的設計。我的模塊是:新聞,文章,視頻,照片,下載,評論,測驗,民意調查等等。所有內容都在單獨的表格中。我有一個喜歡的桌子,用戶可以喜歡或不喜歡一個帖子(在你的案例中)。查詢這些並不複雜。

首先在大多數情況下我的大部分用於模塊表都構成同樣的方式:

  • ID
  • 標題
  • 內容
  • USER_ID(作者)
  • 日期
  • etc

有幾個例外是有時標題被稱爲問題或沒有內容列。這不會導致任何問題。

我喜歡錶的設置是這樣的:

  • ID
  • PAGE_ID
  • 是模塊(沒有它來自哪個表...我有一個模塊表,其中每個模塊都有一個名稱,相關編號,目錄等)
  • POST_ID(對應到模塊表中的id)
  • USER_ID(用戶是誰做的喜好或張貼)
  • 狀態(0 =與,1 =不喜歡)
  • 日期(當喜好/不喜歡發生)

模塊表例如:

  • ID
  • 標題
  • 目錄
  • post_type

id  title    directory   post_type 
1  News    news    news 
2  Episode Guide  episodes   episode 
3  Albums   discography/albums album 

基本上你將有一個類似的設置,根據需要爲您的需要修改表結構。

查詢來獲取所有喜歡或收藏爲特定的用戶:

$getlikes = mysql_query("SELECT DISTINCT post_id, module_id, page_id FROM likes WHERE user_id = $profile_id ORDER BY id DESC LIMIT $offset, $likes_limit", $conn); 
$likes = mysql_num_rows($getlikes); 

if($likes == "0"){ 
echo "<br><Center>$profile_username does not have any liked posts at this time.</center><BR>"; 
} 
else { 
echo "<table width='100%' cellspacing='0' cellpadding='5'> 

<Tr><th>Post</th><th align='center'>Module</th><th align='center'>Page</th><tr>"; 

while ($rowlikes = mysql_fetch_assoc($getlikes)) { 
    // echo data 

$like_page_id = $rowlikes['page_id']; 
$like_module_id = $rowlikes['module_id']; 
$like_post_id = $rowlikes['post_id']; 


// different modules have different fields for the "title", most are called title but quotes is called "content" and polls is called "questions" 
if($like_module_id == "11"){ 
$field = "question"; 
} 
elseif($like_module_id == "19"){ 
$field = "content"; 
} 
else{ 
$field = "title"; 
} 





// FUNCTIONS 
PostURL($like_page_id, $like_module_id, $like_post_id); 
ModTitle($like_module_id); 
ModTable($like_module_id); 
ModURL($like_page_id, $like_module_id); 
fpgURL($like_page_id); 


$getpostinfo = mysql_query("SELECT $field AS field FROM $mod_table WHERE id = $like_post_id", $conn); 
$rowpostinfo = mysql_fetch_assoc($getpostinfo); 
$like_post_title = $rowpostinfo['field']; 

// Using my "tiny" function to shorten the title if the module is "Quotes" 
if($like_module_id == "19"){ 
Tiny($like_post_title, "75"); 
$like_post_title = "\"$tiny\""; 
} 


if(!$like_post_title){ 
$like_post_title = "<i>Unknown</i>"; 
} 
else { 
$like_post_title = "<a href='$post_url'>$like_post_title</a>"; 
} 

echo "<tr class='$altrow'> 
<td>$like_post_title</td> 
<td align='center'><a href='$mod_url'>$mod_title</a></td> 
<td align='center'>$fpg_url</td> 


</tr>"; 

$altrow = ($altrow == 'altrow')?'':'altrow'; 

} // end while 

echo "<tr><Td align='center' colspan='3'>"; 

// FUNCTIONS - Pagination links 
PaginationLinks("$cs_url/users/$profile_id", "likes"); 

echo "</td></tr></table>"; 

} // end else if no likes 

好了,可能是你很難理解,因爲我有很多我自己的變量,但基本上它得到的模塊ID和從喜歡的表中發佈ID,然後運行查詢以獲得帖子的標題以及我想要的原始作者的任何其他信息。

我已經「模塊」功能設置將返回網址或給你提供它的ID模塊的稱號。

+0

嘿,非常感謝你給出的詳盡答案。我也有一個非常類似於你的結構,所以將它保存在同一張表中並不困難。此外,我正在使用具有通用外鍵的Python的Django框架。這允許我在同一個表中保留不同的對象引用。但我的問題沒有實現,更多的是基於性能的。當用戶數量增加並且這些表格開始填滿時會發生什麼? – Sachin

相關問題