學會了使用LitePal來創建表和升級表的方式,那麼今天就讓咱們一塊兒繼續進階,探究一下如何使用LitePal來創建表與表之間的關聯關係。程序員
喜歡把全部的代碼都寫在一個類裏的程序員確定是個新 手。沒錯,任何一個像樣的程序都不可能僅僅只有一個類的,一樣地,任何一個像樣的數據庫也不可能僅僅只有一張表。咱們都知道,在面向對象的編程語言中,多 個類之間能夠相互關聯引用,共同完成某項功能。那麼在數據庫當中,多個表之間能夠相互關聯嗎?固然能夠!只不過表與表之間的關聯關係要比對象之間的關聯關 系複雜一些,也更加難懂,可是做爲數據庫的基本功,仍是應該瞭解清楚的,那麼咱們就先來學習一下數據庫表關聯的基礎知識。數據庫
表與表之間的關聯關係一共有三種類型,一對一、多對一、和多對多,下面咱們分別對這三種類型展開進行討論。編程
表示兩個表中的數據必須是一 一 對應的關係。這種場景其實並非很常見,咱們仍是經過例子來直觀地體會一下,例子仍然是在以前文章的基礎上展開的。數據庫設計
如今咱們已經建立好了news這張表,裏面主要記錄了新聞的標題和內容,那麼除了標題和內容以外,有些新聞還可能帶有一些導語和摘要,咱們把這兩個字段放在 一張introduction表中,做爲新聞的簡介。那麼很顯然,news表和introduction表就是一對一的關係了,由於一條新聞只能對應一個 簡介,一個簡介也只能屬於一條新聞。它們之間的對應關係大概以下圖描述的同樣:編程語言
能夠看到,News1對應了Introduction2,News2對應了Introduction3,News3對應了Introduction1,但無論怎麼樣,它們都是一對一的關係。學習
那麼這種一對一的關係,在編程語言中該怎麼體現出來呢?相信熟悉面向對象設計的你,必定很輕鬆就能想出來吧,只須要在News類中持有一個 Introduction類的引用,而後在Introduction類中也持有一個News類的引用,這樣它們之間天然就是一對一的關係了。網站
沒錯,對象之間的一對一關係很是簡單易懂,那麼難點就在於,如何在數據庫表中創建這樣的一對一關係了。因爲數據庫並不像面向對象的語言同樣支持相互引用,若是想讓兩張表之間創建一對一的關係,通常就只能經過外鍵的方式來實現了。所以,一對一關係的表結構就能夠這樣設計:spa
請注意,introduction表中有一個news_id列,這是一個外鍵列,裏面應該存放一個具體的新聞id,這樣一條introduction就能對應一條news,也就實現一對一的關係了,以下圖所示:設計
由 此咱們就可以看出,id爲1的introduction對應着id爲2的news,id爲2的introduction對應着id爲3的news,id爲 3的introduction對應着id爲1的news。須要注意的是,一對一的關係並無強制要求外鍵必須加在哪一張表上,你能夠在 introduction表中加一個news_id做爲外鍵,也能夠在news表中加一個introduction_id做爲外鍵,無論使用哪種,均可 以表示出它們是一對一的關聯關係。對象
表示一張表中的數據能夠對應另外一張表中的多條數據。這種場景比起一對一關係就要常見太多了,在咱們平時的開發工做中多對一 關係真的是比比皆是。好比說如今咱們的數據庫中有一個news表,還有一個comment表,它們兩個之間就是典型的多對一關係,一條新聞能夠有不少條評 論,可是一條評論只能是屬於一條新聞的。它們的關係以下圖所示:
而 這種多對一的關係在編程語言中是很是容易體現出來的,好比Java中就有專門集合類,如List、Set等,使用它們的話就能輕鬆簡單地在對象之間創建多 對一的關係,咱們稍後就會看到。那麼,這裏的難點仍然是在數據庫表中如何創建這樣的多對一關係。如今說難點其實已經不難了,由於前面咱們已經學會了一對一 關係的創建方法,而多對一也是相似的。沒錯,數據庫表中多對一的關係仍然是經過外鍵來創建的,只不過一對一的時候外鍵加在哪一張表上均可以,但多對一的時候關鍵必需要加在多方的表中。所以,多對一關係的表結構就能夠這樣設計:
在comment表中有一個news_id列,這是一個外鍵列,裏面應該存放一個具體的新聞id,而且容許多條comment都存放同一個新聞id,這樣一條評論就只能對應一條新聞,但一條新聞卻能夠有多條評論,也就實現多對一的關係了,以下圖所示:
由此咱們就能夠看出,id爲一、二、3的三條評論是屬於第一條新聞的,而id爲四、5的兩條評論是屬於第二條新聞的。
表示兩張關聯表中的數據均可以對應另外一張表中的多條數據。這種場景也不算是很常見,但比一對一關係要稍微更加經常使用一些。舉 個例子,咱們都知道新聞網站是會將新聞進行種類劃分的,這樣用戶就能夠選擇本身喜歡的那一類新聞進行瀏覽,好比說網易新聞中就會有頭條、科技、娛樂、手機 等等種類。每一個種類下面固然都會有許多條新聞,而一條新聞也多是屬於多個種類的,好比iPhone6發佈的新聞既能夠屬於手機種類,也能夠屬於科技種 類,甚至還能夠上頭條。所以,新聞和種類之間就是一種多對多的關係,以下圖所示:
可 以看到,News1是屬於Category1的,而News2和News3都是既屬於Category1也屬於Category2,如此複雜的關聯關係該 如何表示呢?在面向對象的編程語言中一切都是那麼的簡單,只須要在News類中使用集合類聲明擁有多個Category,而後在Category類中也使 用集合類聲明擁有多個News就能夠了,咱們稍後就會看到。而難點仍然是留在了數據庫上,兩張表之間如何創建多對多的關聯關係呢,仍是用外鍵嗎?確定不行 了,多對多的狀況只能是藉助中間表來完成了。也就是說,咱們須要多創建一張表,這張表沒什麼其它做用,就是爲了存放news表和category表之間的 關聯關係的,以下圖所示:
注意這裏咱們創建一張名爲category_news的中間表,中間表的命名並無什麼強制性的約束,但一個良好的命名規範可讓你一眼就明白這張表是用來 作什麼的。中間表裏面只有兩列,並且也只須要有兩列,分別是news表的外鍵和category表的外鍵,在這裏存放新聞和種類相應的id,就可讓它們 之間創建關聯關係了,以下圖所示:
由此咱們就能夠看出,第一條新聞是屬於第一個種類的,而第二和第三條新聞,則既屬於第一個種類,也屬於第二個種類。反過來也能夠這樣看,第一個種類下面有第1、第2、第三這三條新聞,而第二個種類下面只有第2、第三這兩條新聞。無論怎麼看,多對多的關係都是成立的。
好了,三種關聯關係都講完了,那咱們來簡單總結一下吧。雖然說上面介紹了花了很大的篇幅講解數據庫的表關聯知識,但其實最後的結論是很是簡單的,你們能夠當成口訣同樣背下來。即一對一關聯的實現方式是用外鍵,多對一關聯的實現方式也是用外鍵,多對多關聯的實現方式是用中間表。記下了這個口訣,在不少數據庫設計的時候,你均可以發揮得更加遊刃有餘。