2015-07-10 70 views
0

我正在開發一個類似twitter的android應用程序。我只想知道它背後的邏輯。社交網絡背後的數據庫結構[指導]

當談到mysql,我會爲每個註冊用戶創建一個新的數據庫,或者我有一個龐大的數據庫併爲每個註冊用戶創建一個表?那麼每個用戶都會在他們的表或數據庫中擁有用戶名,密碼,好友列表和帖子列嗎?

我基本上想知道我是否應該做一個新的數據庫中的每個新用戶或現有數據庫中的表..

感謝,併爲不確定性遺憾。

+0

爲每個用戶創建一個新數據庫......? O。 – Kritner

+3

也沒有。不要爲*每個*成員創建單獨的對象(數據庫,表格或其他)。爲「用戶」設置一個表格,併爲每個用戶添加一個新表格。爲「Posts」等提供單個表格。您可能需要先熟悉數據庫的工作原理以及應該如何使用它的基礎知識。 – Siyual

+0

但是說我有一張表格,我怎麼看誰發佈每篇文章?因爲用戶在不同的表中? –

回答

3

這聽起來像你是完全新的這個...這是一個粗略的輪廓,如何設置一個典型的應用程序的用戶。我會用一些你可能想查找的術語來更好地學習一些數據庫的基礎知識。我會把它們放在雙引號中,並在底部包含一個列表。

將有一個數據庫爲您的應用程序。該數據庫將包含一個名爲'user'的表,其中包含'id','username','password'列(您需要了解如何將密碼安全地存儲在數據庫中,這超出了此響應的範圍。請勿將密碼存儲在普通文本中)。包含密碼是因爲應用程序控制登錄。您不使用MySQL用戶作爲您的應用程序用戶。 MySQL可能有兩個用戶 - 一個給你,一個給你的應用程序。如果你已經知道這一點,我很抱歉;你看起來很新,你可能不會,如果是這樣的話,值得一提的是,它會爲你節省很多麻煩。

該應用程序的每個用戶都將作爲該表中的行/條目存在。列'id'就是所謂的「主鍵」。這意味着該值對於表中的每個條目都是不同的,並且用於唯一標識每個用戶。

然後,您要讓用戶可以創建帖子。每個用戶都可以創建多個帖子,但每個帖子只能由一個用戶創建,因此這是「一對多關係」。這通常如何實現是通過創建第二個表'post'。發佈有專欄'id','作者'和'內容'。同樣,post.id是此表的主鍵。 post.author是所謂的「外鍵」。這意味着它引用了一個主鍵 - 在這個例子中是user.id。把它看作某種指針。如果您想查找創建帖子的人的用戶名,您可以查看「帖子」表中帖子的條目,並找到該條目的作者值。您可以使用該號碼在用戶表中查找帖子的作者。

例如,請考慮下表:

user 
id username 
1 awesome_user 
2 more_awesome_user 
3 less_awesome_user 

post 
id author content 
1 1  I am awesome 
2 3  Yes you are, awesome_user 
3 2  I am more awesome 
4 1  No you're not 
5 2  Yes I am look at my name 
6 1  having more_ in front of your name doesn't make you more awesome 

在這種情況下,你可以告訴大家,「我真棒」後由用戶awesome_user「創建,因爲post.author = user.id爲那個帖子和用戶。要學習如何真正編寫這樣的查詢,你應該谷歌術語「連接表」。

接下來,讓我們說你需要讓用戶能夠喜歡帖子。用戶可以喜歡很多帖子,並且許多用戶可以喜歡帖子,使其成爲「多對多」的關係。典型的做法是通過一個代表這種關係的新表格。讓我們調用表'user_likes_post'。該表將包含以下列:用戶,帖子。這些都是對應表的外鍵。現在

,對於一個例子:

user_likes_post 
user post 
1 2 
3 5 

在這種情況下,你可以告訴用戶awesome_user「喜歡交「是的,你是,awesome_user」由「less_awesome_user」寫,因爲你可以看一下用戶1在用戶表中,您可以在帖子表中查找帖子2。同樣,在編寫查詢時,您可以連接表來實現此目的。

請注意,user_likes_post沒有id列。這是因爲,在這種情況下,我們將使用主鍵(user,post)而不是(id)。主鍵可以由多個列組成。這隻能在沒有兩行對這兩列具有相同值時才能完成。換句話說,以下是允許的:

user post 
1 2 
1 3 
2 2 

但是,這是不允許的

user post 
1 2 
1 2 

這對我們來說是有用的,因爲這樣可以防止我們,因爲它會阻止雙喜好。這也可以通過將id列作爲主鍵並在(user,post)上有一個「唯一約束」來完成,但是我們很難不需要唯一標識一個like,所以沒有任何意義有ID列,因爲它只會浪費空間。值得注意的是外鍵也可以由多個列組成,所以仍然可以從另一個表中引用一個類似的東西。但是,如果您正在考慮這樣做,我建議使用ID列。

我建議你谷歌以下條款,並確保你瞭解他們。這可能看起來很混亂,但要特別注意數據庫的規範化。理解數據庫規範化背後的一些原因是設計一個可靠數據庫的關鍵。例如,如果數據庫中有多個數據位於多個位置,那麼這是一件壞事。它不僅佔用額外的空間,而且如果這些數據發生變化,您將需要在每個地方進行更改。如果你有一個列'用戶名','密碼','內容'的表'後',然後用戶想改變他們的密碼,你將不得不找到後用該用戶名的所有條目,並改變所有那些條目的密碼。如果你錯過了一次,它可能會導致一些嚴重的問題。數據庫規範化只是設計數據庫以避免類似問題的更正式定義。將其視爲數據庫設計的「最佳實踐」;如果你知道自己在做什麼,可以打破規則,但作爲一個初學者,遵守這些規則將爲你節省很多麻煩。

希望這可以幫助您學習如何設計數據庫。讓我知道你是否想澄清這一點。祝你好運!

  • 主鍵
  • 外鍵
  • 約束
  • 唯一約束
  • 一個一對一的關係
  • 一個一對多的關係
  • 許多一對多的關係
  • 加入表
  • 實體關係圖
  • 數據庫規範化
+0

只爲努力而奮鬥的聖盃。 – Luceos

+0

嗯,這是我在這個網站上的第一篇文章,所以我不妨將它做好,哈哈 –

+1

另外,我親眼見過當一個根本不知道一對多關係如何工作的人(如在包含管道分隔值的列中)設計整個應用程序。我花了兩年的時間試圖清理5年的這些爛攤子......如果我能夠通過儘早解決問題來救別人,我很高興。 –