2010-11-23 54 views
3

我目前正在重組我的站點的數據庫。由於我現在的模式不是最好的模式之一,我認爲從您那裏聽取一些建議會很有幫助。小部件驅動的站點的數據庫模式建議

首先,我的網站實際上由小部件組成。對於每個窗口小部件,我需要一個settings(其中每個窗口小部件的實例都有其用戶定義的設置)的表格,common(同一窗口小部件的實例之間的共享項目)和userdata(用戶在窗口小部件實例中保存的數據)。

到現在爲止,我有以下模式,由2個數據庫:

  • 的第一個數據庫,在那裏,我把所有的網站維護表(例如用戶,窗口小部件安裝,日誌,通知,消息等。 )加上一個表格,我將每個小部件實例加入每個實例化的用戶,併爲其指定了一個唯一的ID(所以,我有以下列:user_id,widget_idunique_id)。
  • 第二個數據庫,我保存了所有與窗口小部件相關的數據。這意味着,對於每個小工具(由其widget_id唯一)我有三個表:[widget_id]_settings,[widget_id]_common[widget_id]_userdata。在每個表中,每行都保存用戶小部件的unique_id。實際上,這裏是存儲在小部件中的所有用戶數據。

爲了讓我的數據庫是如何工作的一個簡單的例子:

第一個數據庫:

  • users表我已經user_id = 1
  • widgets表我有widget_id = 1
  • users_widgets表中我有user_id = 1, widget_id = 1, unique_id = 1

第二個數據庫:

  • 1_settings我有unique_id = 1, ...,其中...表示用戶的窗口小部件設置
  • 1_common我有代表相同的部件的實例之間共享數據的幾行(所以,這裏沒有用戶特定的數據)
  • 1_userdata我有unique_id = 1, ...,其中...表示用戶的窗口小部件數據。這裏一個重要的通知是,該表可以包含多個行具有相同unique_id(例如,對於任務的小部件,用戶可以有幾個任務小組件實例)

希望你在粗糙的我的數據庫架構的理解。

現在,我想開發一個'更乾淨的'模式,因此在我的應用程序中不需要有2個數據庫並且每次都從一個切換到另一個。如果我找到一種方法來避免在第二個數據庫中生成表格(1_settings,2_settings,...,n_settings),那也會很好。

我將非常感謝任何努力提出任何更好的方式來實現這一點。非常感謝您提前!

編輯: 我應該在我的腦海喜歡的MongoDB或CouchDB的數據庫restructurating我的數據庫是什麼時候?我的意思是,對於第二個數據庫,如果我沒有固定的模式,會更好。 另外,傳統的SQL和NoSQL如何在同一個網站上相處?

回答

6

的users_widgets表一個可能的模式可能是:

id | user_id | widget_id 

你不需要unique_id字段中users_widgets表,除非你想隱藏出於某種原因主鍵。實際上,我會將這個表重新命名爲widget_instances,並在第二個數據庫的其餘表中使用widget_instance_id。辦理第二套表格

一種方式是通過使用風格:

widget_instance_settings

id | widget_instance_id | key | value 

這包括用戶數據,因爲user_id是關係到widget_instance_id,除非您想允許用戶創建同一窗口小部件的多個實例,並且出於某種原因在所有實例中具有相同的數據。

widget_common_settings

id | widget_id | key | value 

這種類型的模式可以在包中可以看到像Elgg

0

您是否知道小部件類和小部件實例可能具有的設置?在這種情況下,可以將這些設置設置爲widget_class表(用於常用設置)和widget_instance(例如特定設置)的列。
如果您不知道它們,那麼您可以擁有一個與widget_class表具有多對一關係的widget_class_settings表和一個與widget_instance表具有多對一關係的widget_instance_settings。在widget_instance和widget_class之間,你可以再次擁有多對一的關係。 widget_instance也可以在users表中有一個外鍵,以便您知道哪個用戶創建了特定的小部件。

+0

你混淆了一些表格,也許我在我的解釋中不是很清楚。用戶可以創建一個小部件(並將其上載到我的網站上),並且用戶可以使用小部件。這是兩個不同的故事。我沒有第一個問題,只有第二個問題。當安裝新的小部件時,第二個數據庫中會創建3個不同的表(這是現在發生的情況)。這3個表格中的每一個都有一個預定義的模式,就像這個小部件需要的一樣(而任務部件需要一個`task_name`列,註釋部件需要一個`note_content`列)。所以所有列都是預定義的。 – linkyndy 2010-11-23 17:56:50

+0

現在,當用戶開始使用小部件時,我們在第一個數據庫中的'users_widgets`表中添加一個新行,其中包含`unique_id`。然後,我們在第二個數據庫的`[widget_id] _settings`中添加一個新行,使用`unique_id`。設置行是必需的;每個小部件實例必須在設置表中註冊。當用戶添加一些內容(例如任務)時,我們在`[widget_id] _userdata`中創建一行,同時使用`unique_id`和任務。我想知道的是我該如何改進這個系統,因此沒有兩個數據庫,從哪個數據庫組成'n'表。謝謝! – linkyndy 2010-11-23 18:03:14