Android数据库高手秘籍(四)——使用LitePal创建表关联

学会了使用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、第三这两条新闻。无论怎么看,多对多的关系都是成立的。

好了,三种关联关系都讲完了,那咱们来简单总结一下吧。虽然说上面介绍了花了很大的篇幅讲解数据库的表关联知识,但其实最后的结论是很是简单的,你们能够当成口诀同样背下来。即一对一关联的实现方式是用外键,多对一关联的实现方式也是用外键,多对多关联的实现方式是用中间表。记下了这个口诀,在不少数据库设计的时候,你均可以发挥得更加游刃有余。

相关文章
相关标签/搜索