我目前正在重組我的站點的數據庫。由於我現在的模式不是最好的模式之一,我認爲從您那裏聽取一些建議會很有幫助。小部件驅動的站點的數據庫模式建議
首先,我的網站實際上由小部件組成。對於每個窗口小部件,我需要一個settings
(其中每個窗口小部件的實例都有其用戶定義的設置)的表格,common
(同一窗口小部件的實例之間的共享項目)和userdata
(用戶在窗口小部件實例中保存的數據)。
到現在爲止,我有以下模式,由2個數據庫:
- 的第一個數據庫,在那裏,我把所有的網站維護表(例如用戶,窗口小部件安裝,日誌,通知,消息等。 )加上一個表格,我將每個小部件實例加入每個實例化的用戶,併爲其指定了一個唯一的ID(所以,我有以下列:
user_id
,widget_id
和unique_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如何在同一個網站上相處?
你混淆了一些表格,也許我在我的解釋中不是很清楚。用戶可以創建一個小部件(並將其上載到我的網站上),並且用戶可以使用小部件。這是兩個不同的故事。我沒有第一個問題,只有第二個問題。當安裝新的小部件時,第二個數據庫中會創建3個不同的表(這是現在發生的情況)。這3個表格中的每一個都有一個預定義的模式,就像這個小部件需要的一樣(而任務部件需要一個`task_name`列,註釋部件需要一個`note_content`列)。所以所有列都是預定義的。 – linkyndy 2010-11-23 17:56:50
現在,當用戶開始使用小部件時,我們在第一個數據庫中的'users_widgets`表中添加一個新行,其中包含`unique_id`。然後,我們在第二個數據庫的`[widget_id] _settings`中添加一個新行,使用`unique_id`。設置行是必需的;每個小部件實例必須在設置表中註冊。當用戶添加一些內容(例如任務)時,我們在`[widget_id] _userdata`中創建一行,同時使用`unique_id`和任務。我想知道的是我該如何改進這個系統,因此沒有兩個數據庫,從哪個數據庫組成'n'表。謝謝! – linkyndy 2010-11-23 18:03:14