2010-05-14 40 views
12

我設計了使用PHP的新聞飼料系統/ MySQL的類似於Facebook的。PHP新聞飼料數據庫和設計

我以前也問過類似的問題,但現在我已經改變了設計和我在尋找的反饋。

實例新聞:

USER_A評論USER_B的新專輯

"Hey man nice pictures!" 

USER_B增加了新的照片爲[他/她] 輪廓

 [show photo thumbnail] 

起初,我對實現這個OBJ1使用過度列:類型1 | Obj2:Type2 |等等。

現在的設計是建立使用幾個特殊的關鍵字,以及演員/接收器的關係。我的數據庫使用的郵件表中加入了含有用戶標識,actionid,receiverid,receiverObjectTypeID表,

下面是它的將是什麼樣子,一旦加入了一個濃縮版:

News_ID | User_ID |     Message     |  Timestamp 

    2643  A  %a commented on %o's new %r.     SomeTimestamp 
    2644  B  %a added a new %r to [his/her] profile.   SomeTimestamp 

%A =的的USER_ID做動作

%R =接收對象的人

%O =接收對象的所有者(例如專輯的所有者)(如果NULL%r是一個用戶)

問題:

  1. 這是一個聰明的(有效的/可擴展)的方式前進?

  2. 我怎麼能存儲「事件預覽」?例如,如果我想顯示User_A對User_B所做的評論(如上所述,並在Facebook的新聞提要中)。我一直只使用相關數據的編碼副本..例如JSON編碼註釋文本或照片視爲HTML ..但這似乎脆弱(用戶可以刪除照片,而它仍然在另一個用戶的飼料)

  3. 如何顯示如下消息:「User_B向他的 個人資料添加了4張新照片。」與照片的縮略圖?

回答

10

剛剛建立了類似的東西,我建議的一件事就是分開如何從性能中存儲數據的想法。就我而言,用戶需要能夠回頭看看任何時間段的新聞,所以arnorh的假設不起作用(無論如何,沒有理由存儲HTML,如果你不必 - 離開在外面格式化)。

我發現的是我將這些東西存儲在幾個類中,ActivityTypeActivityActivityType保存消息的格式(如'%a commented on %o's new %r'),並指示它是代表實際活動還是對其他人的活動發表評論(因此我知道要鏈接哪個對象,演員的活動或活動的演員評論過)並且Activity存儲對象的actor,victim,主鍵,如果存在的話,則存在被註釋的對象的主鍵以及它發生的時間戳。

這是很好的結果,在很好的規範化數據。只要你有六個朋友,它就會慢慢爬行(由於整個事情都是基於位置的,因此性能很複雜,所以我正在查看每個用戶遠離你的距離)。現在大家都在尋找藉口來玩NoSQL存儲系統,但這實際上是一個很好的例子。爲了從關係數據庫中獲得不錯的表現,你將不得不從數據中去規範化。由於各種關係的交叉點,這些東西很難緩存。考慮將數據存儲在MySQL中,但將其從NoSQL存儲系統中取出。

+0

謝謝湯姆,我開始根據您的建議研究NoSql。有沒有一篇文章或其他資源可以幫助我理解/實施這樣的策略? 另外,我是否需要重構現有的關係數據庫以適應NoSql檢索? – pws5068 2010-05-20 18:54:12

+1

我在http://delicious.com/yerfatma/nosql上有幾個書籤 - 列表中的最後一個聲稱是「NoSQL Required Reading」。數據庫和nosql存儲是兩個獨立的東西。他們根本不需要了解對方。這個想法是你儘可能少地從數據庫中獲取數據;一旦你有了PHP代碼中的數據,將它緩存在nosql存儲中,這樣你就可以從那裏得到它,直到它失效。 – Tom 2010-05-20 19:25:03

+0

現在更清楚了,我會繼續我的研究。感謝您的幫助 – pws5068 2010-05-20 19:42:39

1
  1. 是的,它是與此前進的韌皮方式。這些消息的生活時間非常短,因此如果您對存儲的消息的HTML進行更改等,則無需及時更新它們。因此,使用該消息時應該保持良好的狀態。

  2. 只需使用普通的HTML。它會很快,並且沒有任何關係,你將不得不稍後執行,你永遠不必能夠更新那些或那樣的東西。

編輯:其實我誤會了,我不知道你的意圖%S-事情要對你引用什麼對象一些特殊的符號。我只是將簡單的HTML通知放在該文本中。

+1

存儲html鏈接每個對象並預覽每個動作(並鏈接每個圖像)似乎很脆弱。如果用戶更改或刪除他們的圖片,數據庫存儲斷開的鏈接 – pws5068 2010-05-14 19:07:27

+0

我上面的設計嘗試近似儘可能多,同時分離關於對象的信息,可能會改變特殊替換..但可能有一個更傳統的(更好)的方式 – pws5068 2010-05-14 19:08:55

+0

它可能看起來很「脆弱」(從來沒有見過這個詞,有趣),但事實是從活動發生時到用戶看到通知時發生這種情況的可能性很小,另外,爲什麼你提到圖片?我們正在談論通知,類似於FB的?所以這是一個用戶名/用戶ID,並且您的圖像可能只是從ID /用戶請求的,您無論如何都不會引用文件名。 – arnorhs 2010-05-16 01:53:21

1

當您在談論Facebook時,您必須考慮發件人和收件人。

說你什麼時候想看到B的所有消息/提要?那麼你必須啓動一個查詢嗎?我認爲你的表格看起來不錯,但也爲接收者的身份證添加欄。也許你可以把它保存在單獨的表格中。

所以,你可以很容易地找到所有飼料用戶B OR 從用戶B OR 從用戶A向用戶B

希望,這可能對您有所幫助。

但是,如果您只想專注於提要,請忽略此操作。那麼你只需要最新的。我認爲是w.r.t. facebook,我們可以在差異中看到任何人的個人資料。用戶。

謝謝。

3

我有一個類似的問題,在這裏#2類似的問題 - 我們的問題看起來幾乎一樣:)檢查它 - getting JSON data-tree from MySQL

但我試圖解決在一點點不同的方法的問題:我創建JSON對象。 所以我的新聞源表看起來像這樣:

news_type | datetime_added | params 
------------+-----------------+-------------------------------------------------------- 
new_photos | 2010.12.01  | {user_id: "12", photo_id: "26", photo_url: "/images/photo.jpg"} 
new_comment | 2010.12.01  | {owner_id: "12", photo_id: "26", photo_url: "/images/photo.jpg", commenter_id: 25, comment_text: "Nice!"} 

然後我用json_decode在PHP創建數組。 然後根據news_type創建需要的HTML。