可以有一个连带关系,我给你举个例子,一个用户表,一个信息表,一个用户对应多条信息,当你删除用户的时候是不是这个用户的信息也要被删除,如果没有关系的话,你就要在删除用户前手工写条sql语句去删除信息表里的对应信息,如果有关联的话,就不用了,级联删除就可以了,只要删除用户,这个用户下面的信息也就没了。明白了没有?明白了要给分的哦 :)
MySQL里面有如下的表
user:id username
photo:id name
photo_favour(收藏关系表):photo_id user_id
假设这几个表都相当大,需要进行分表。我的分表规则是:
user表按照id取模,这样user相关的表都可以按照这个取模后的结果来分表;
photo表按照id取模,同样与photo相关的表都可以按该规则分表;
至于photo_favour是一个多对多的关系表,我现在的想法是该表复制多一份,一份以photo_id来分表,一份以user_id分表,分别建立不同的索引,这样就变为两个一对多的关系。
我有两个问题:
1、这样的分表可行吗,有更好的分表方法吗?
2、一对多的关系在进行分表时候,例如user表和user_favour表都按照user_id来取模得到序号x来确定分表。如果1个用户会有100条收藏记录,那么user_x有100W条记录时候user_favour_x分表就有1000W记录,这时候user_favour_x又需要分表了,怎么解决这种情况?
这种情况我会放弃多对多的形式,弄两个表
user_to_photos: user_id, photo_id_list
photo_to_users: photo_id, user_id_list
1个user喜欢的photo id全塞到photo_id_list
1个photo被哪些用户喜欢了,也全塞到user_id_list
这样的读取就高效了很多,,写的时候注意并发脏写。。。同样你根据user_id爱怎么分表就怎么分。
===
如果收藏量太大,还是不能满足,就要考虑切分记录,1个user可以拥有多条记录,每条记录都可记录多个photo id
user_to_photos: user_id, num, photo_id_list
num字段可有可无,如果你需要精确定位user 222 收藏的 photo 333在哪条记录,就需要安排好算法,找到对应的num
大概是这样,重点是算法逻辑
数据库中建表时经常所说一对一、一对多、多对多等等关系究竟是什么意思?分别在什么情况下要用到一对一或一对式,而又在什么情况下又要用到多对多?在这里我们详细分析,并且用实例来讲解各种关系的实际运用!
关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系;一对多:从球队角度来说一个球队拥有多个球员 即为一对多多对一:从球员角度来说多个球员属于一个球队 即为多对一数据表间一对多关系如下图:
关联映射:一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。图示如下:
一对一外键关联:
----------------------------------------------------------------------------------------------------------
前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。
按照数据库的增删查改 *** 作,多对多关系的查找都可以用inner join或者
select from 主表 where id in (select 主表id from 关系表)
1,角色任命型
特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。
界面特点:显示主表,用checkbox或多选select设置多选关系。
例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表5行纪录就可以确立,关系表的两个外键具有联合主键性质。
增加关系:如果没有组合纪录,insert之。
删除关系:如果有组合纪录,删除之。
2,集合分组型
特点:同角色任命型类似,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。区别是主副表都不是字典表,可能都很大不固定。
界面特点:显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。
例如:歌曲专集(专集表-关系表-歌曲表)。手机分组(分组表-关系表-手机表)。用户圈子(圈子表-关系表-用户表)。文章标签(文章表-关系表-标签表)
增加关系:同版主任命型。
删除关系:同版主任命型。
3,明细帐型
特点:关系表可以有重复纪录,关系表一般有时间字段,有主键,可能还有文字型的字段用来说明每次发生关系的原因(消费)。
界面特点:显示关系表,用radio或下拉设置单选关系。
例如:现金消费明细帐或订单(用户表-订单表-消费原因表),用户可能多次在同一事情上重复消费。积分变化纪录也属于这类。
增加关系:不管有没有组合纪录,insert之,纪录时间。
删除关系:根据关系表PK删除。
4,评论回复型
特点:同明细帐型关系表一般有时间字段,有主键,区别是重点在文字型的字段用来说明每次发生关系的内容(评论回复)。
界面特点:回复文本框。
例如:论坛回复(用户表-回复表-帖子表),用户可能多次在不同帖子上评论回复费。
增加关系:不管有没有组合纪录,insert之,纪录时间和文字。
删除关系:根据关系表(回复表)PK删除。
5,站内短信型
特点:主副表是同一个,关系表一般有时间字段,有主键,重点在关系表文字型的字段用来说明每次发生关系的内容(消息)或者其他标记位来表示文字已读状态时间等。
界面特点:回复文本框。
例如:站内短信(用户表-短信表-用户表),用户可能给用户群发或者单发,有标记位来表示文字已读状态时间等。
增加关系:不管有没有组合纪录,insert之,纪录时间和文字。
删除关系:根据关系表(回复表)PK删除。
6,用户好友型
特点:主副表是同一个,同集合分组型,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。
界面特点:同集合分组型,显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。
例如:下载站点的文件,(文件表-关系表-文件表)可以被软件工具打开,软件工具本身也是一种文件,可以被下载。用户的好友,也是用户(用户表-好友关系表-用户表)
增加关系:同版主任命型。
删除关系:同版主任命型。
7,未知属性型
特点:在设计初期,主表的某些字段类型和名称是不确定的时候,关系表实际上是主表的可扩展字段,
一个[主表](ID),
一个[属性名称表](属性ID属性名称),
一个[属性值表],包括3个字段:
属性值(属性Value varchar(500))
主表ID
属性ID
这样可以作到最小冗余度。
(和常见的多对多关系不同的是:值统一用varchar来存储,因为这类型的值一般不会用来计算)。
比如:
军队的数据库设计中有种物资叫做“战缴物资”,就是打仗的时候缴获的,军队自己都不知道这些物资有什么属性。
比如缴获的化学品有化学名,通用名,是否有辐射,计量单位,包装规格,数量等等,或者不是化学品是其他任何未知的东西。
这样东西就可以
某奇怪东西属性集合["某某奇怪属性名"]="某某奇怪值";
某变态东西属性集合["某某变态属性名"]="某某变态值";
这样存储。
再比如:
手机型号有几千种,除了共同属性外还有不同属性有几百个,属性名和值类型都不一样,有的手机有这属性,有的没有。
对于这样的“多态”,我们就采用上面的设计结构。
其效果相当于:
某奇怪手机属性集合["某某奇怪属性名"]="某某奇怪值";
某变态手机属性集合["某某变态属性名"]="某某变态值";
界面特点:设置主表一行纪录的属性时候,要列出所有可能的属性名称,每个对应一个文本框。
建立关系在开始着手考虑建立关系表之间的关系之前,你可能需要对数据非常熟悉。只有在熟悉数据之后,关联会比你刚开始的时候更明显。你的数据库系统依赖于在两个数据表中找到的匹配值来建立关系。如果在数据库系统中发现了一个匹配值,系统将从两个数据表中提取数据并创建一个虚拟的记录。例如,你可能想要查看某个特定的作者所写的全部书籍,在本文中,系统将从 “books”和“authors”这两个数据表中查找相关的匹配值。需要注意的是,在大多数情况下,查询的结果是动态的,这意味着对这条虚拟记录所做的任何改动都将可能作用到底层的数据表上,这一点是非常重要的。 进行匹配的值都是主键和外键的值。(关系模型不要求一个关系必须对应的使用一个主键来确定。你可以使用数据表中的任何备选关键字来建立关系,但是使用主键是大家都已经接受的标准。)主键(primary key)唯一的识别表中的每个记录。而外键(foreign key)只是简单的将一个数据表中的主键存放在另外一个数据表中。同样地,对于你来说也不需要做太多的工作——只是简单地将主键加到关系表中,并将其定义为外键。 唯一需要注意的是,外键字段的数据类型必须和主键的数据类型相同。但是有些系统可以允许这条规则有一个例外,它允许在数字和自动编号(autonumbering)字段(例如在sql服务器系统中访问identity和autonumber)之间建立关系。此外,外键的值可以是空(null),尽管强烈建议在没有特别原因的情况下,不要让外键为空。你有可能永远都不会有机会来使用需要这项功能的数据库。 现在回到我们的示例关系表,并开始输入合适的外键。(请继续在纸上打草稿——在你的数据库系统中创建真正的数据表还为时过早。要知道在纸上纠正错误要容易得多。)要记住,你正在把主键的值添加到关系表里。只要调用实体之间的关系就行了,而其他的就简单了: 书籍和分类是有关系的。
书籍和出版社是有关系的。
书籍和作者是有关系的。
作者和邮政编码(zip)是有关系的。
邮政编码和城市是有关系的。
城市和州是有关系的。 这一步并不是一成不变的,你可能会发现在规范化的过程中加入外键会更容易一些。在把字段移动到一个新的数据表时,你可能要把这个新数据表的主键添加到原来的数据表里,将其作为外键。但是,在你继续规范化剩余数据的时候,外键常常会发生改变。你会发现在所有这些数据表被全部规范化之后,一次添加所有的外键,这样效率会更高。 *** 作数据表
现在让我们一次 *** 作一个数据表,就从books数据表开始,它在这个时候只有三个字段。
1、首先,打开软件,打开你的数据库的几个表。点击上面的数据库工具,在关系选项组里选择关系。
2、这时,d出对话框,选择你要建立关系的那几个表,点击添加。
3、这时,进入关系界面,用鼠标左键按住表1里的姓名往右边移动到表2的姓名处松开左键。
4、这时,d出编辑关系对话框,点击创建。同样的把另一个编辑好。
5、这样就可以了,点击关闭,这时d出提示框,点击是就完成了。
设置关联的两表或者多表、通过外键关联、外键字段是从表中的字段、外键(foreign
key)字段需要在主表做主键(primary
key)、
比如
学生表(学号
主键,姓名)
主表
课程表(课号
主键,课名)
主表
选了表(学号
外键,
课号
外键,成绩)
从表
这样三个表就关联了、记住建表顺序、先主表、再从表
然后可以使用代码或者图形界面管理器创建外键、创建完就关联了
外键的取值必须是主键的值
1、打开数据库,在“数据库工具”栏中点击“关系”按钮。
2、系统会d出提示,进行表的添加,选中要建立关系的表,点击添加。
提示不会自动关闭,需要再点击“关闭”按钮来关掉它。
3、通过用鼠标拖动就可以完成关系的建立,比如我拖动“学生信息”表中的学号,到“课程成绩”表里学号的位置。
4、d出“编辑关系”对话框,点击“创建”按钮,这样就建立了两表间的关系。
5、其表现形式是一条折线将其连在一起。同样我们也可以创建“课程成绩”表与“课程信息”表之间的关系。选中的关系会是较粗的线。
6、删除关系。在选中的关系上(就是线上)右击,可以删除这个关系。
7、参照完整性。关系可以设定参照完整性,这样你在其中一个表中更改或删除记录时,将同步到另一个表。
8、系统默认下并没有开启关系的参照完整性。在“编辑关系”对话框中,勾选“实施参照完整性”,再根据需要勾选下面两个选项,可以实施它。
以上就是关于数据库建立表间关联有什么作用全部的内容,包括:数据库建立表间关联有什么作用、数据库如何建立表间一对多关系、如何定义数据库表之间的关系(上)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)