精华内容
下载资源
问答
  • 数据库表关联

    千次阅读 2009-10-02 16:42:00
    随着数据库的正规化工作的完成,数据库中的各个数据中的数据关系也就建立起来了。 在设计关系型数据库时,最主要的一部分工作是将数据元素如何分配到各个关系数据中。一旦完成了对这些数据元素的分类,对于数据...

    特别说明数据库的正规化是关系型数据库理论的基础。随着数据库的正规化工作的完成,数据库中的各个数据表中的数据关系也就建立起来了。

    在设计关系型数据库时,最主要的一部分工作是将数据元素如何分配到各个关系数据表中。一旦完成了对这些数据元素的分类,对于数据的操作将依赖于这些数据表之间的关系,通过这些数据表之间的关系,就可以将这些数据通过某种有意义的方式联系在一起。例如,如果你不知道哪个用户下了订单,那么单独的订单信息是没有任何用处的。但是,你没有必要在同一个数据表中同时存储顾客和订单信息。你可以在两个关系数据表中分别存储顾客信息和订单信息,然后使用两个数据表之间的关系,可以同时查看数据表中每个订单以及其相关的客户信息。如果正规化的数据表是关系型数据库的基础的话,那么这些数据表之间的关系则是建立这些基础的基石。

    出发点下面的数据将要用在本文的例子中,用他们来说明如何定义数据库表之间的关系。通过Boyce-Codd Normal Form(BCNF)对数据进行正规化后,产生了七个关系表:

    Books: {Title*, ISBN, Price}Authors: {FirstName*, LastName*}ZIPCodes: {ZIPCode*}Categories: {Category*, Description}Publishers: {Publisher*}States: {State*}Cities: {City*}

    现在所需要做的工作就是说明如何在这些表之间建立关系。

    关系类型在家中,你与其他的成员一起存在着许多关系。例如,你和你的母亲是有关系的,你只有一位母亲,但是你母亲可能会有好几个孩子。你和你的兄弟姐妹是有关系的——你可能有很多兄弟和姐妹,同样,他们也有很多兄弟和姐妹。如果你已经结婚了,你和你的配偶都有一个配偶——这是相互的——但是一次只能有一个。在数据表这一级,数据库关系和上面所描述现象中的联系非常相似。有三种不同类型的关系:

    一对一:在这种关系中,关系表的每一边都只能存在一个记录。每个数据表中的关键字在对应的关系表中只能存在一个记录或者没有对应的记录。这种关系和一对配偶之间的关系非常相似——要么你已经结婚,你和你的配偶只能有一个配偶,要么你没有结婚没有配偶。大多数的一对一的关系都是某种商业规则约束的结果,而不是按照数据的自然属性来得到的。如果没有这些规则的约束,你通常可以把两个数据表合并进一个数据表,而且不会打破任何规范化的规则。

    一对多:主键数据表中只能含有一个记录,而在其关系表中这条记录可以与一个或者多个记录相关,也可以没有记录与之相关。这种关系类似于你和你的父母之间的关系。你只有一位母亲,但是你母亲可以有几个孩子。

    多对多:两个数据表里的每条记录都可以和另一个数据表里任意数量的记录(或者没有记录)相关。例如,如果你有多个兄弟姐妹,这对你的兄弟姐妹也是一样(有多个兄弟姐妹),多对多这种关系需要引入第三个数据表,这种数据表称为联系表或者连接表,因为关系型系统不能直接实现这种关系。

    建立关系在开始着手考虑建立关系表之间的关系之前,你可能需要对数据非常熟悉。只有在熟悉数据之后,关联会比你刚开始的时候更明显。你的数据库系统依赖于在两个数据表中找到的匹配值来建立关系。如果在数据库系统中发现了一个匹配值,系统将从两个数据表中提取数据并创建一个虚拟的记录。例如,你可能想要查看某个特定的作者所写的全部书籍,在本文中,系统将从“Books”和“Authors”这两个数据表中查找相关的匹配值。需要注意的是,在大多数情况下,查询的结果是动态的,这意味着对这条虚拟记录所做的任何改动都将可能作用到底层的数据表上,这一点是非常重要的。

    进行匹配的值都是主键和外键的值。(关系模型不要求一个关系必须对应的使用一个主键来确定。你可以使用数据表中的任何备选关键字来建立关系,但是使用主键是大家都已经接受的标准。)主键(primary key)唯一的识别表中的每个记录。而外键(foreign key)只是简单的将一个数据表中的主键存放在另外一个数据表中。同样地,对于你来说也不需要做太多的工作——只是简单地将主键加到关系表中,并将其定义为外键。

    唯一需要注意的是,外键字段的数据类型必须和主键的数据类型相同。但是有些系统可以允许这条规则有一个例外,它允许在数字和自动编号(autonumbering)字段(例如在SQL服务器系统中访问Identity和AutoNumber)之间建立关系。此外,外键的值可以是空(Null),尽管强烈建议在没有特别原因的情况下,不要让外键为空。你有可能永远都不会有机会来使用需要这项功能的数据库。

    现在回到我们的示例关系表,并开始输入合适的外键。(请继续在纸上打草稿——在你的数据库系统中创建真正的数据表还为时过早。要知道在纸上纠正错误要容易得多。)要记住,你正在把主键的值添加到关系表里。只要调用实体之间的关系就行了,而其他的就简单了:

    书籍和分类是有关系的。 书籍和出版社是有关系的。 书籍和作者是有关系的。 作者和邮政编码(ZIP)是有关系的。 邮政编码和城市是有关系的。

    城市和州是有关系的。

    这一步并不是一成不变的,你可能会发现在规范化的过程中加入外键会更容易一些。在把字段移动到一个新的数据表时,你可能要把这个新数据表的主键添加到原来的数据表里,将其作为外键。但是,在你继续规范化剩余数据的时候,外键常常会发生改变。你会发现在所有这些数据表被全部规范化之后,一次添加所有的外键,这样效率会更高。

    操作数据表现在让我们一次操作一个数据表,就从Books数据表开始,它在这个时候只有三个字段。很明显,Authors、Categories和Publishers数据表的主键会被添加到Books里。当你完成的时候,Books数据表就有了七个字段:

    BooksTitle (PK)ISBN (PK)

    PriceFirstNameFK (FK) Authors.FirstName many-to-manyLastNameFK (FK) Authors.LastName many-to-manyCategoryFK (FK) Categories.Category many-to-manyPublisherFK (FK) Publishers.Publisher one-to-many

    要记住,Authors数据表里的主键是一个基于姓和名两个字段的复合关键字。所以你必须要把这个两个字段都添加到Books数据表里。要注意,外键字段名的结尾包含有FK这个后缀。加入这个后缀有助于提高可读性和自我归档。通过名称这种方式来区别外键会使得追踪它们更简单。如果主键和外键的名称不同,这没有关系。

    这里出现了三种关系:Books和Authors、Books和Categories,以及Books和Publishers。这三种关系中所存在的两种问题可能没有那么明显:

    Books和Authors之间的关系:一本书可以有多个作者。

    Books和Categories之间的关系:一本书可以被归入多个类。

    这两者的关系是多对多的关系。先前我告诉过你,数据表不能直接实现这样的关系,而需要第三个联系表来实现。(Books和Publishers的关系是一对多的关系,就像现在所说的,这样是没有问题的。)

    这两个新发现的多对多关系将需要一个联系表来包含来自每个数据表的主键,并将其作为外键。新的联系表是:

    BooksAuthorsmmlinkTitleFK (FK) Books.Title one-to-manyISBNFK (FK) Books.ISBN one-to-manyFirstNameFK (FK) Authors.FirstName one-to-manyLastNameFK (FK) Authors.LastName one-to-many

    BooksCategoriesmmlinkTitleFK (FK) Books.Title one-to-manyISBNFK (FK) Books.ISBN one-to-manyCategoryFK (FK) Categories.Category one-to-many

    没有必要更改Categories、Authors或者Publishers数据表。但是,你必须把FirstNameFK、LastNameFK和CategoryFK这三个外键从Books里移走:

    BooksTitle (PK)ISBN (PK)PricePublisherFK (FK) Publishers.Publisher one-to-many

    现在,让我们转到Authors数据表上来,它现在有两个字段。每个作者都和ZIPCodes数据表中的邮政编码的值相关。但是,每个邮政编码会和多个作者相关。要实现这种一对多的关系,就要把ZIPCodes数据表中的主键添加进Authors数据表作为外键:

    AuthorsFirstName (PK)LastName (PK)ZIPCodeFK (FK) ZIPCodes.ZIPCode one-to-many

    至此,你已经准备好了处理剩下的地址部分了。看到它们被分在不同的数据表里是很让人奇怪的,但是这是遵照BCNF正确规范化数据的结果。每个邮政编码的值只会有一个对应的城市值和州值。每个城市和州的值只会被输入进其对应的数据表里一次。ZIPCodes和Cities数据表需要外键字段来实现这些关系:

    ZIPCodesZIPCode (PK)CityFK (FK) Cities.City one-to-many

    CitiesCity (PK)StateFK (FK) States.State one-to-many

    StatesState (PK)

    从一个到九个最后,你有了九个数据表:Books、Authors、Categories、Publishers、ZIPCodes、Cities、States、BooksAuthorsmmlink和BooksCategoriesmmlink。图A是这个示例数据表的数据库最终的图形形式。很难想像一个简单的数据表会被分成九个数据表。

    图A最初的一个数据表现在需要九个数据表了

    由于这个示例数据库很简单,你可能会问这些关系有什么作用。看起来仍在保存冗余的数据,只不过形式不同罢了——通过外键来实现。这是因为我们的数据表现在只有很少几个字段。试想一下有十几个字段的数据表,会是什么样的一个情形。需要承认的是,你仍然需要把数据表的主键作为外键保存进关系表里,但是至多可能最多增加一到两个字段。比较一下为这个数据表里的每一条记录都添加十几个条目的情形吧。(

    http://hi.baidu.com/zhulin10541/blog/item/492e970271d7037e3812bb47.html

    展开全文
  • LitePal数据库表关联,Android关系型数据库开发 一对多: class Image extends DataSupport{ private Task task; //自动生成get,set } class Task extends DataSupport{ private List<Image> images; //自动...

    LitePal数据库表关联,Android关系型数据库开发

    一对多:

    class Image extends DataSupport{
    private	Task task;
    //自动生成get,set
    }
    
    class Task extends DataSupport{
    private	List<Image> images;
    //自动生成get,set
    }
    

    Note: 自动生成的get,set方法,不能擅自乱改,详情–>Lite Pal注意事项 , 不想把某个变量当作字段 , get 和 set 方法 不能乱改

    如果保存关联数据表保存

    先保存Image,再把保存过的实列添加到Task中的 List<images>List <images> 中,再然后保存Task

    class Task extends DataSupport{
    	//...........
    	public void addImages(Image ...images){
    		for(Image image:images){
    			image.setTask(this);//这一步可写,可不写
    			image.save();
    			this.images.add(image);
    		}
    	}
    	//.........
    }
    

    获取关联数据

    当关联数据保存时,litepal会自动地在Image表上新建一个foreignkey:taskidforeign_{-}key : task_{-}id
    所以就可以用这个外键来获取关联数据.

    class Task extends DataSupport{
    	//...........
    	public List<Images> getAllIimages(){
    		return DataSupport.where("task_id=?",this.getId()+"").find(Image.class)
    	}
    	//.........
    }
    

    Note:以上两个方法千万不能和自动生成的get,set方法混淆 . Lite Pal注意事项 , 不想把某个变量当作字段 , get 和 set 方法 不能乱改

    展开全文
  • Hadoop实现数据库表关联

    千次阅读 2013-05-29 20:32:55
    Hadoop实现数据库表关联主要有两种方式:Map Side Join和Reduce Side Join。本文主要讨论Reduce Side Join的实现与优化。Reduce Side Join是一个完整的MapReduce Job。在Map阶段将来自不同源的原始数据进行...

    Hadoop实现数据库表关联主要有两种方式:Map Side JoinReduce Side Join。本文主要讨论Reduce Side Join的实现与优化。Reduce Side Join是一个完整的MapReduce Job。在Map阶段将来自不同源的原始数据进行区分,对来自不同表的记录构造关联键并将来自不同“表”的记录划分到同一个分组。在Reduce阶段,将来自不同的表记录进行关联。

    Reduce阶段,一般将所有记录进行划分(区分该记录来在于哪个数据库表),然后将区分的不同表进行关联。在这种情况下,所有的记录都需要读入到内存,严重的影响程序的效率。在这个阶段,我们可以将程序进行优化:将数据量最大的表排列到最后。在读入内存的时候,只需要将小表保存到内存即可。当遍历到大表时开始进行关联,并将结果进行输出。

    为了在Reduce阶段能够区分该条记录是来自数据量较大的表还是来自数据量较小的表,我们需要在Reduce的输入<KeyValue>中进行标记。那么我们思考一下,Map输出的Key应该包含什么呢?其应该主要包含以下几个内容:

    1.关联主键

    2.来源标记,标记其来源于哪个数据库表

    3.大小标记,标记其是属于数据量比较大的表还是数据量比较小的表

    仅仅对Key进行修改,还不能达到我们所需要的优化效果。应该我们还需要对Reduce的输入按照小表的数据都在前面而大表的数据都在后面进行排序。只有这样才能够只需要缓存小表。为了达到这个效果我们需要实现两个ComparatorKey进行排序。一个是Sort Comparator,一个是Group ComparatorGroup Comparator主要是对关联主键进行关联,将关联键相同的记录划分到一起。Sort Comparator负责对所有的记录进行排序,首先根据“关联键”进行排序;然后根据“大小标记”进行排序,来自小表的记录排在前面。这样,我们就可以实现对数据库表关联的优化。

    具体的代码如下面所示:(程序只是示例,写的不够严谨,仅作说明使用)

    *********************************************************************

      public class TagedKey implements WritableComparable<TagedKey> {

    public Text key;//关联主键

    public IntWritable tag;//来源标记

    public IntWritable size;//大小标记

    .......

    }

    *********************************************************************

     

    *********************************************************************

    public class GroupComparator extends WritableComparator {

    public GroupComparator() {

    // TODO Auto-generated constructor stub

    super(TagedKey.classtrue);

    }

    @Override

    public int compare(WritableComparable a, WritableComparable b)  {

    // TODO Auto-generated method stub

    TagedKey key1 = (TagedKey) a;

    TagedKey key2 = (TagedKey) b;

    return key1.key.compareTo(key2.key);

    }

    }

    *********************************************************************

    *********************************************************************

    public class OrderComparator extends WritableComparator {

    public OrderComparator() {

    // TODO Auto-generated constructor stub

    super(TagedKey.classtrue);

    }

    @Override

    public int compare(WritableComparable a, WritableComparable b)  {

    // TODO Auto-generated method stub

    TagedKey key1 = (TagedKey) a;

    TagedKey key2 = (TagedKey) b;

    if (key1.key.compareTo(key2.key) != 0) {

    return key1.key.compareTo(key2.key);

    else {

    return key1.size.compareTo(key2.size);

    }

    }

    }

    *********************************************************************

    *********************************************************************

    job.setSortComparatorClass(OrderComparator.class);

    job.setGroupingComparatorClass(GroupComparator.class);

    *********************************************************************

    展开全文
  • 数据库表关联方式

    千次阅读 2018-12-04 13:37:05
    数据库表连接方式Hash连接(hash join)嵌套循环(nested loops)Sort merge-join Hash连接(hash join) 简单的对于两个表来讲,hash-join就算讲两表中的小表(称S)作为hash表,然后去扫描另一个表(称M)的每一行数据...

    Hash连接(hash join)

    简单的对于两个表来讲,hash-join就算讲两表中的小表(称S)作为hash表,然后去扫描另一个表(称M)的每一行数据,用得出来的行数据根据连接条件去映射建立的hash表,hash表是放在内存中的,这样可以很快的得到对应的S表与M表相匹配的行。

    嵌套循环(nested loops)

    嵌套循环连接,是比较通用的连接方式,分为内外表,每扫描外表的一行数据都要在内表中查找与之相匹配的行,没有索引的复杂度是O(N*M),这样的复杂度对于大数据集是非常劣势的,一般来讲会通过索引来提升性能。

    Sort merge-join

    merge join需要首先对两个表按照关联的字段进行排序,分别从两个表中取出一行数据进行匹配,如果合适放入结果集;不匹配将较小的那行丢掉继续匹配另一个表的下一行,依次处理直到将两表的数据取完。merge join的很大一部分开销花在排序上,也是同等条件下差于hash join的一个主要原因。

    参考链接:
    Hash join.
    多表连接的三种方式.

    展开全文
  • 数据库表关联的三种方式

    千次阅读 2014-09-12 14:58:25
    数据库表关联的三种方式  (2012-01-20 14:01:15) 转载▼ 标签:  oracle   数据表关联   hash   杂谈 分类: BI理论 NESTED LOOP  对于被连接的数据子集较...
  • 数据库表关联映射

    2018-11-29 14:55:14
    数据之间的关联关系分为3种:一对一,一对多,多对多. 一对一 是将数据垂直切分,其实是不常见的,或不常用的.也就是A的一条记录对应B的一条记录, 例如:一个系统必然有员工(包含字段:EmployeeId、姓名、性别...
  • Oracle数据库表关联的一条准则

    千次阅读 2012-04-17 10:46:38
    Oracle数据库表关联的一条准则 如果一个主表要关联一个子表信息进行联查时 比如A是主表 A1是子表 selct * from A left join A1 on A.id = A1.nmainid where A1.某某字段 进行些限制 and A1.其他标识= '...
  • 左联的数据库表,然后显示的在页面显示的jsp里面改一下代理种类ID的name,这样在页面上显示的不是id了,而是变成你修改了以后相对于的name了 转载于:https://www.cnblogs.com/likeji/p/6155260.html...
  • (原创)OrnLite数据库缓存的介绍以及使用、一对多三级关联表及其CRUD怎删查改等操作demo;关联博客http://blog.csdn.net/lnn368
  • 该方案主要解决问题,比如服务器A部署了数据库A,里面储存的是用户的信息记录user,服务器B部署了数据库B,里面存储的是订单信息记录order,两个可以通过user_id进行关联,如果是这样,用thinkPHP5该如何进行关联...
  • sql 数据库表关联查询

    2015-06-29 10:12:16
    # sql表关联查询出的结果想再次约束(where)取出结果如何做,如下图,图为已取出的结果,想将 publiction_set_id 的值为null的数据提出,怎么做? ![图片说明]...
  • select * from [数据库1].[1] , [数据库2].[2] where 字段='?' 转载于:https://www.cnblogs.com/ph121/p/6839465.html
  • 我想问一下在实际的项目开发中,Hibernate的关联关系和数据库表关联关系需要同时建立吗?就是既在持久化对象里写关联关系又在数据库里建外键
  • 在不同的sqlserver数据库中,需要进行不同数据库中的在同一sql语句中进行关联查询,可以事先在服务器上的SqlServer数据库中先执行以下sql语句:  (1)exec sp_addlinkedserver @server= 'WLSQL', @srvproduct= ''...
  • 数据库表关联关系表结构字段命名

    千次阅读 2017-06-22 17:40:14
    存在SysDictType(字典类型)和SysDictData(字典数据...SysDictData多对一单向关联SysDictType的code字段。 SysDictType在SysDictData实体中定义为:  @ManyToOne  private SysDictType type; 外部调
  • 数据库表关联小结

    2016-05-24 14:43:52
    这3种关联的区别是,当两个有不关联的字段存在时,得出的结果才会有差别。 比如a、b两个关联关系为a.b_id = b.id 如果a中的每个a.b_id在b中都有对应的,并且,b中的b.id在a中都有对应的。 那么从查询结果
  • 假设有A,B两,其中A表字段“学期”存放的是id值,它关联B的,并根据id值取得B 某一字段Trem(存放具体学期名称如“第一学期”)。现在我需要显示A中字段“学期” 的值,可是只能显示id值,我怎么能...
  • mysql数据库表关联关系级联删除问题

    千次阅读 2018-11-03 14:27:08
    场景“删除一个的数据的时候,将相关的相关数据删除。” 例 : table1 : 活动(主) table2:活动图片(外键活动id) table3:评论(外键活动id) table4:报名 table5:活动报名关系(外键活动id,报名id)...
  • django admin 数据库表关联关系的问题

    千次阅读 2018-01-10 11:58:02
    关联关系字段 (Relationship fields) ForeignKey,ManyToManyField与OneToOneField分别在Model中定义多对一,多对多,一对一关系。 例如,一本书由一家出版社出版,一家出版社可以出版很多书。一本书由多个作者...
  • 相对应,有一个班级t_clazz和学生t_student,学生中维护所在班级的id。 我使用普通的jdbc,在向学生插入数据的时候,是不是也要把学生所在班级id传过来, 也就是在插入方法(DAO层)里,不仅要传入学生对象,...
  • 但是一般情况下,我们在介绍这些方法的使用过程中,无疑都是在同一个数据库(SQLServer)和同一个用户下(Oracle)下的环境中使用,但是很多用户在实际过程中使用了关联,其实都是空间数据和属性数据的关联,这些...
  • 但是一般情况下,我们在介绍这些方法的使用过程中,无疑都是在同一个数据库(SQLServer)和同一个用户下(Oracle)下的环境中使用,但是很多用户在实际过程中使用了关联,其实都是空间数据和属性数据的
  • 工具使用很多公司都会使用的Navicat ,我用的小黄爪 在对别人完成的项目,接过来,个人习惯先看数据库,对数据库关系简单的熟悉下 之前在网上下过导图模型类的...首先:右键库 (不是) 直接逆向数据库到模型 就可以了 ...
  • 易语言ACCESS数据库表关联查询例程.rar 易语言ACCESS数据库表关联查询例程.rar 易语言ACCESS数据库表关联查询例程.rar 易语言ACCESS数据库表关联查询例程.rar 易语言ACCESS数据库表关联查询例程.rar ...
  • 添加测试和一些测试数据。----------t1-----------CREATE TABLE `t1` (`id` int(20) NOT NULL default '0',`field01` varchar(100) default NULL,`field02` varchar(100) default NULL,PRIMARY KEY (`id`))数据: ...
  • 易语言ACCESS数据库表关联查询例程源码,ACCESS数据库表关联查询例程
  •  项目中要开发一个表示数据库表关联关系的图,在选型时费了些功夫。先后尝试了几种方案,Canvas和SVG(不好用),jsplumb(适合做流程图,太重),最终当看到echarts 中的graph 的时候,我眼前一亮,就是她了。 ...
  • 数据库分区表关联

    千次阅读 2017-06-28 22:40:29
    数据库表分区 场景: 现实业务中有两个表关系比较紧密,而且数据量比较大的时候,需要对两个表都进行分区,并能很好的发挥分表作用 创建分区数据库表 注意: 数据库表最好是在创建的时候就进行分区,不能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,533
精华内容 7,813
关键字:

数据库表关联