簡體   English   中英

了解大型mysql數據關系

[英]Understanding large mysql data relations

我正在努力教自己如何使用SQL,即mysql。

我想要了解的是如何在同一個表中處理許多不同類型的數據。 假設我正在構建一個Web應用程序,並且我有許多不同的內容類型(博客項目,評論項目,文件,頁面,表單),我需要為每個內容存儲不同的數據字段。 我是否會為每種不同的內容類型創建一個新表,因為每種內容類型都有自己獨特的字段要求,或者有更好的方法嗎? 為每種類型的內容創建一個新表似乎有點多。 如果我在我的網絡應用程序中有30種類型的內容,那么只有30種類型的表格,這似乎有點多。 而且,如果我有一個新的內容類型,我將不得不創建一個新表,其中包含該類型所需的所有必填字段。

當我有許多不同類型的內容,每個內容需要不同的數據字段需要進入數據庫時​​,有沒有更好的方法來做這樣的事情? 我可以以某種方式檢查內容的類型,然后選擇另一個包含所有不同字段類型的表嗎?

對於做什么有點困惑。

舉個例子:

Stack Overflow本身使用相同的數據庫表(稱為Posts)來提問和回答。 即使這兩種類型的數據不相同,網站創建者也認為它們相似,足以將它們放入一個表中。 有一個PostTypeId字段,說明這篇文章是一個問題還是一個答案。 在答案上,標題字段將為NULL,在問題上,其他列可能會被忽略。

另一方面,評論位於不同的表格中。 當然,理論上你可以把它們放在同一個Posts表中並有一個PostTypeId用於注釋。 但是這會產生的開銷(因為注釋的輕量級)證明創建一個新表是合理的。

我知道這不是一個真正的答案,其他開發人員甚至可能決定將問題和答案放入不同的表格中; 但它提供了一些觀點。 長話短說:這取決於:)

素描互動

首先嘗試不考慮數據庫設計,但實體應如何在它們之間進行交互 可以想象它,因為每個實體都有自己的Class,它代表了所需的數據。

這是一個良好的開端,用鉛筆和紙張繪制這些實體之間的相互作用,以及你想要完成的交互(或關系)。 學習數據庫設計過程

可擴展性和重用性

例如,您希望擁有一個可以發布BlogPostUser ,每個BlogPost都可以擁有一組Tag和相關的Comment集。 Attachment可以注入BlogPost,也可以注入Comment。

可重用性和可擴展性是關鍵。 在草繪交互時嘗試隔離依賴關系。 以OO的方式考慮它。 讓我們再探討一下Attachment 您可以創建一個附件表,然后通過創建擴展Attachement BlogPostAttachmentCommentAttachment在這里你可以輕松地創建這些可靠的實體之間的關系。 這將創建一個易於擴展的內容類型,您可以在其中進一步重用。 UserDetailsAttachment

ORM拯救

通過研究像DoctrinePropel這樣的Object relational mappers示例代碼使用,您可以掌握表擴展性的一些想法。 實際的例子總是最好的。

您可能感興趣的相關SO問題

我知道,這還有很長的路要走,但考慮到創建具有許多關系和實體類型的大規模數據庫應用程序的因素,從長遠來看最好使用ORM的幫助

你不必害怕使用很多表 - 數據庫很樂意處理很多表而不抱怨。 如果您讓每種內容類型都有自己的表,那么您將獲得以下優勢:

  1. 簡單 :每個表都可以非常簡單,約束很簡單。 例如,如果ContentType1具有與另一個表有關系的字段,則可以在數據庫設計中將其設為外鍵,並且RDBMS將為您處理數據完整性。
  2. 索引效率 :如果ContentType2需要按日期索引,但ContentType3需要按名稱索引(舉一個簡單的例子),將它們放在兩個單獨的表中意味着每個索引都准確存在它所需的數據而不是其他任何東西。 將它們組合在一個表中意味着您需要兩個覆蓋組合數據集的索引,這些索引更加混亂並占用更多磁盤空間。

如果需要輸出組合兩種內容類型的列表,則兩個表中的UNION都很容易; 如果你需要經常使用大量數據,索引視圖可以使它便宜。

另一方面,如果您有兩種非常相似的內容類型(例如上面的StackOverflow情況),您可以通過將它們組合到一個表中獲得一些優勢:

  1. 簡單性 :您只需要對表進行一次編碼 - 如果操作正確(即兩種內容類型非常相似),這可以使您的代碼庫更小更簡單。
  2. 可擴展性 :如果第三種內容類型與前兩種內容類型相似,並且與前兩種內容類型相似,則表格可以直接擴展為存儲所有三種內容類型。
  3. 索引性能 如果獲取數據的最常見方式是組合兩種內容類型並按日期(例如)對兩種內容類型共同的字段進行排序,那么必須重復使用兩個單獨的表可能效率低下UNIONed然后排序。 將兩種內容類型組合在一個表中可以讓您在日期字段上放置一個索引,從而允許更快的查詢(但請記住,您可以從索引視圖中獲得類似的好處)。

如果嚴格規范化 ,您將擁有一個數據庫,其中每個實體類型在數據庫中都有自己的表。 但是,以各種方式進行非規范化(例如在一個表中組合兩個實體類型)可能會帶來好處,這可能會(取決於數據的大小和形狀)超過成本。 我建議至少在開始時保持所有內容類型分離的策略,並考慮將它們組合為戰術非規范化(如果事實證明是必要的話)。

您需要閱讀有關使用PHP和MySQL構建網站的書籍。 谷歌首先是一個很好的態度,因為一些程序員認為這是一個懶惰的問題。 我建議閱讀“學習PHP MySQL和JavaScript”。 無論如何,在開始編寫站點之前,您需要計划要存儲的信息,然后設計數據庫。 假設注冊表單將包含A First_Name,Second_Name,DateOfBirth,Country,Gender和Email。 您創建一個名為“USER_INFO”的表,並指定與您要存儲的數據匹配的數據類型,數字,文本,日期等等,然后通過PHP連接到MySQL並存儲或檢索您想要的數據。 你真的需要閱讀一本書或一本教程,以便得到一個完整的答案,並且GOOGLE:P

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM