2011-04-16 53 views
4

我正在研究模塊化CMS,我一直在思考內容架構。我需要一個靈活的系統,可以輕鬆創建不同的內容類型。每種內容類型都有一個處理它的模塊(或其他模塊中的方法)。該模塊處理創建,操作並幫助顯示內容(視圖負責查看內容,模塊爲他們提供信息)。CMS的內容結構

每種內容類型都有它自己的表,並且不知道其他內容類型。

Contents和Content_types是負責存儲有關內容的信息的表。

Contents 
--------------------------------------------------------------------------------------- 
id slug   content_type_id in_table_id language_id uid  parent_id 
1  about-us  1     1    1   83j8je29 0 
2  o-nama   1     2    2   83j8je29 0 
3  first-page  1     3    1   12j83j28 0 
4  prva-strana  1     4    2   12j83j28 0 
5  news   2     1    1   mSk2919k 0 
6  vijesti   2     2    2   mSk2919k 0 
7  breaking-title 3     1    1   B8392mkA 5 
8  vazna-vijest 3     2    2   B8392mkA 6 

Content_types 
------------------ 
id content_type 
1 page  
2 category 
3 article 

該目錄保存了內容的蛞蝓,內容類型,該類型的內容,語言ID,UID的表格內容的ID - 這是唯一的內容,所以我們可以輕鬆地配對多語言內容和父母身份。

這是語言表...

Languages 
--------------------------- 
id friendly_name sid 
1 english   eng 
2 hrvatski   cro 

這是一個內容類型表的一個例子。

Pages 
--------------------------------------------------------------- 
id title  content        author_id 
1 About Us This is a page about us blah blah 5 
2 O nama  Ovo je stranica o nama    5 
3 First Page Content        2 
4 Prva strana Sadržaj        3 

那麼,所有這些功能如何?

比方說,我們去: http://www.website.org/en/about-us

  1. 確定語言(EN),並找出它的ID號(1)
  2. 確定蛞蝓(約-US)
  3. 選擇內容與語言ID爲1和slug「about-us」
  4. 確定內容類型和in_table_id
  5. 調用負責打開(處理)該類型內容的模塊
  6. 模塊現在已加載。它現在找到ID爲1的頁面並顯示它。

又如: http://www.website.org/en/news/breaking-title

  1. 確定語言(EN),並找出它的ID(即1)
  2. 確定蛞蝓(新聞)
  3. 我們有兩個蛞蝓(打破標題)
  4. 現在我們找到帶有「破折號」子彈的內容,其中父母是「新聞」
  5. 調用負責模塊打開(處理)該類型的內容
  6. 模塊現在已加載。它現在找到ID爲1的文章並顯示它。

如果我們會去http://www.website.org/en/news/它會確定這是一個類別,並呼籲負責處理類模塊和我們需要什麼(在這種情況下是顯示所有的兒童內容)

我我想我想出了一個非常靈活的系統,但由於我不是很有經驗的程序員(我17歲),所以我不太確定,所以我問你對這個概念有什麼看法?

+0

你能分享一下你在這方面學到什麼嗎?自從你問這個問題已經有一段時間了。 – 2016-01-15 14:00:58

回答

1

我最近成爲了將這些類型的數據存儲爲metadata的粉絲。明顯的好處是,您可以爲所有內容類型使用單個表,並且(具有5NF標準化數據庫結構)最多可以有兩個附加表用於存儲元數據引用和元數據實際值。這允許高水平的數據抽象和持久性的一般模型。而所有這些炒作詞都意味着更快的發展。

舉一個例子,Elgg是一個流行的基於php的社交網絡框架,在這種存儲方面做得很好。 Flow3,一個概念性但非常整潔的通用PHP開發框架,也使用元數據來保持持久性。

元數據方法的最大好處是您可以一勞永逸地忽略代碼中的SQL語句。鑑於你有正確的持續性的抽象,您可以創建一個像持久對象:

$car = new StdClass(); 
$car->type = 'car'; 
$car->fuel_required = 'petrol'; 
$car->engine_cc = 2400; 
$car->max_passengers = 5; 
$car-save(); 

和你的持久性框架會照顧有關的保存()函數本身,通過迭代對象的屬性,並將其保存在元數據表。如果你需要所有這些工作的例子,我會再次建議安裝並嘗試Elgg。你會發現,幾乎所有的新內容都會被插入到同樣的3-4張表格中。

圍繞使用元數據方法存在一些爭議,主要是基於性能的。不可否認的是,使用這種方法,您的元表將會很快填滿。但是,假設您的索引已到位,即使元表中有數千萬條記錄,您的查詢也會爲您提供合理的響應時間。最重要的是,如果隨着業務的增長,您不能隨意擴展基礎架構,則可以轉向「Amazon s3」或其他分佈式數據存儲解決方案來處理您的可擴展性需求。