2011-06-11 94 views
0

我正在創建一個網站,我希望菜單是動態生成的。可能影響菜單的因素是頁面在網站層次結構中的位置,查看頁面的用戶訪問級別以及頁面類型(新聞發佈,活動詳細信息,產品頁面等)。如何存儲我的菜單結構

最初我想創建一個mysql數據庫,其中包含帶外鍵的菜單項和每個項目的附加細節(菜單項的目標URL,父菜單項,項目標題等)。但我開始遇到項目訂購,多層菜單和多個菜單的問題。

然後,我想爲什麼使用平坦的關係數據庫,當我可以有一個XML文件的結構和順序明確指出。它很少會改變,頁面將不得不查詢MySQL數據庫以獲取其內容,它可以包含一些菜單ID。

你能看到這種方法的缺陷嗎?除了將它用作模板以外,我沒有很多使用xml的經驗,而是使用它來生成其他結構。在PHP和JavaScript中操作有多容易?

回答

1

如果菜單層次結構一次性創建並且極少更新,則可以將該對象存儲爲您選擇的序列化數組/對象。這裏的優點是serialize()/deserialize()比解析XML要快得多。爲此,您必須編寫代碼來更新序列化的對象/數組,但您也必須爲XML執行此操作。它還會將代碼的偏好保留爲XML並降低可移植性。 Con for this在PHP以外不太便攜,並且它的速度真的很快

如果你想保持它的便攜性,你可以應用json_encode/json_decode而不是serialize。 Con對於這個json_encode比序列化慢,pro更容易移植到其他語言,比如saayyy,Javascript。

在MySQL的防禦中,您可以使用adjacency list來存儲/添加/刪除元素到層次結構中,而不必使用adjacency list所描述的方法,從而使事情更加緊湊。如果列表變得很大並且可以永久地改變成許多不同的格式,那麼可以讓你的頭腦變得更快一些。

+0

我做了一個應用程序來建立自定義菜單。它們作爲JSON編碼的多級對象保存在數據庫中,並通過JS函數直接從該對象重新創建。 – Nabab 2011-06-11 01:59:10

0

它將使用XML,例如SimpleXML。然而,XML是一個內存和CPU的飢餓。

最舒服的方法是,當你可以把洞菜單結構作爲一個嵌套數組。那麼也許你可以直接在原生PHP中定義你的結構?您可以創建一個文件:

<?php return array(
/* put your nested array structure here */ 
); 

而且把這種結構在你的邏輯,如:

<?php 
$structure = include('structure.php'); 

這種技術並不那麼廣爲人知,但很輕的和直線前進!

否則,您可以使用parse_ini_file()或保留XML或直接將其解析爲數組。當你回到數據庫解決方案時,「嵌套集」可能會幫助你一次(如果你喜歡複雜但聰明的東西;-))。