2010-01-08 103 views
3

在Facebook FQL頁面上顯示了FQL表格結構,下面的截圖顯示了它的一些內容(屏幕截圖消失了)。在MySQL中存儲數組?

您會注意到有些項目是一個數組,例如meeting_sex,meeting_for current_location。我只是好奇,你認爲他們將它作爲一個數組存儲在mysql中,或者只是將它作爲一個返回,從這些數據中它真的讓我認爲它存儲爲一個數組。如果你認爲它是這樣的,或者你已經做了類似的事情,那麼將這些項目作爲一個數組存儲到一個表字段然後在PHP頁面上將其檢索爲一個數組的方法是什麼?

alt text http://img2.pict.com/3a/70/2a/2439254/0/screenshot2b187.png

回答

5

有用於存儲作爲數組兩個選項:

第一,你所提到的,是使1個或多個,表和枚舉要存儲的每個可能的密鑰。這是搜索和使數據有意義的最佳選擇。

但是,對於您想要執行的操作,請使用serialize()。注意:請勿EVER EVER EVER嘗試使用其原始字符串形式對該數據進行搜索。只需重新加載它,請致電unserialize(),然後搜索您的標準,而不是開發一些瘋狂的搜索模式來執行您的出價。編輯:如果是我,並且這是我爲其他人使用(或者甚至爲了我自己使用,完全誠實)而認真開發的東西,那麼我可能會創建第二個查找表來存儲所有的鍵作爲專欄;哎呀,如果你這樣做,mysql_fetch_assoc()可以通過運行第二個快速查詢給你你想要的數組(或者你可以通過JOIN ed查詢將它們提取出來)。但是,如果這只是快速而骯髒的以完成任何工作,那麼序列化數組可能適合您。除非你真的,真的不在乎搜索那些數據,否則我認爲大多數人會認同,更好的是正確的列與鍵之間的關係。

+0

哦,但是當他最終解決所有想要實現的小錯誤和額外功能時,發現搜索那些「序列化」字段就是其中之一,現在試圖解決問題已經太遲了沒有超過僅僅使其「簡單」節省的成本。 – 2010-01-08 22:49:50

+0

是的,爲了達到這個效果,我在文章末尾添加了一個附錄,我絕對同意你的看法。一旦你走上了這條道路,這將會是六種噩夢,除了一個超級好玩的任務,就是將所有這些數據全部加載並用PHP解析它,無論如何,在這一點上你真的只是實現你自己的非常草率和低效率的數據庫管理系統。 – Dereleased 2010-01-08 22:52:16

+0

所以如果它只是幾個關鍵值反正而不是數組或其他表也許我應該將它們添加到當前表? – JasonDavis 2010-01-08 22:53:53

1

您可以序列化數組,插入它,然後在檢索它時將其反序列化。

11

將數組存儲在數據庫中的正確方法是將其存儲爲表,其中數組的每個元素都是表中的一行。

其他一切都是黑客,最終會讓你後悔你試圖避免多餘的表的決定。

0

它們可能使用多個表具有多對多關係,但使用連接和MySql的GROUP_CONCAT函數將值作爲數組返回爲一個查詢中的這些列。

2

將它拆分成其他表格。你可以對它進行序列化,但是這可以保證你稍後想要查詢這些數據。稍後保存自己的挫折感,然後立即將其分開。

5

保證你說Facebook沒有將數據存儲在數據庫中的數組中。

你必須認識到關於FQL的一點是你不直接查詢Facebook的主數據服務器。 FQL是一個外殼,旨在爲您提供對基本社交數據的訪問,而不會讓您在具有性能要求的真實服務器上運行瘋狂查詢。主數據庫上任意用戶創建的查詢將是功能性自殺。

FQL提供了一個設計良好的數據返回結構,可方便查詢您正在查詢的數據類型,因此,任何可以具有多個關聯的數據片段(如「meeting_for」)都會打包成一個數組作爲API結果返回之前。

正如其他海報所提到的,在數據​​庫內存儲一個編程語言結構(如數組或對象)的唯一方法就是serialize它。序列化是昂貴的,只要序列化一些東西,就會使其無法用於索引和搜索。作爲一個社交網絡,Facebook需要對幾乎所有內容進行索引和搜索,因此這些數據在主模式中絕不會以數組形式存在。

通常情況下,您曾經想將序列化數據存儲在數據庫中的唯一時間是臨時數據,例如會話數據,或者您有一個有效的性能要求。否則,你的數據很快變得毫無用處。

+0

是的,我現在看到,它只是讓我停下來,思考了一會兒,當我看到那個時候,所以我想現在問我,在我的新項目的早期階段 – JasonDavis 2010-01-08 23:08:10

+0

有確實有效的理由來存儲序列化的數據,但你不想養成它的習慣;) – zombat 2010-01-08 23:13:05