在关系数据库的逻辑设计中,若转换一个1:n的联系为一个关系,则此关系的主键是什么

在关系数据库的逻辑设计中,若转换一个1:n的联系为一个关系,则此关系的主键是什么,第1张

(1)两实体间1:n联系

对于两实体间1:n联系,导出关系模型的原则是:可以将“1”方实体的“主键”纳入“n”方实体对应的关系中作为“外部键”,同时把联系的属性也一并纳入“n”方对应的关系中。

(2)同一实体内部个体间1:n联系

对于同一实体集内部个体间的1:n联系,导出关系模型的原则是:可在这个实体所对应的关系中多设一个属性,用来作为与该实体相联系的另一个体的“主键”。

首先一点是主键是不可能重复,为什么我们要设定主键?主键就是防止重复的数据添加,我给你一个思路:你不是要把重复的数据保存出来吗?你在添加数据的时候首先要进行数据判断,判断甲表中是否有该数据,如果有那么就保存到乙表中,如果没有就保存到甲表中,这样不就把重复的数据保存下来了吗?希望对你有所帮助。

问楼主一个简单的问题:身份z是起什么作用的?主键在数据库里起到的作用就类似于身份z在现实社会中起到的作用。

事实上,主键有时候还分物理主键和逻辑主键。物理主键通常只有标识唯一性的作用,逻辑主键才是用来进行数据之间 *** 作的(比如楼主说的多对多)。物理主键和逻辑主键都是人为设置的,不是Access自带的。

很好,很不错哦。

通俗点儿讲,我现在有一个论坛,有两张表,一张是主贴 thread,一张是回帖 reply

先说说主键,主键是表里面唯一识别记录的字段,一般是帖子id,体现在访问的时候,例如是

threadphpid=1 表示我要访问的是帖子id是1 的帖子~

再来说说外键,当我们删除某个帖子的时候,需要执行另一个 *** 作,就是删除所有回帖,如果正常情况下,我们需要执行两次delete *** 作(thread和 reply),这时候如果存在外键,例如,在reply 表里面建立一个指向thread表的主键(id)的外键(这个外键绑的字段,必须是对应帖子的id),并指定响应 delete ,那你在删除 thread 的时候,mysql 自己会帮你把 reply 表中这个帖子的回复都删掉,而不需要你手动再去执行一次reply表的delete *** 作~

至于两者之间的关系,在刚才的例子中,reply 表的外键,指向的就是 thread 表的主键~~

InnoDB默认创建的主键索引是聚簇索引(Clustered Index),其它索引都属于辅助索引(Secondary Index),也被称为二级索引或非聚簇索引。

我们使用一个 表来详细说明 商品表 CREATE TABLE `merchandise`

 (

`id` int(11) NOT NULL,

`serial_no` varchar(20) DEFAULT NULL,

 `name` varchar(255) DEFAULT NULL,

`unit_price` decimal(10, 2) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE

)

CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

插入数据:

id    serial_no   name   unit_price

1    21002    鼠标    100

5    21003    键盘    300

8    20021    显示器    1200

11    12172    手柄    350

18    22391    主机箱    3798

InnoDB 索引默认使用的是B数索引,(关于B+树的数据结构,有兴趣的可以去翻翻相关资料。)mysql 聚簇索引(主键)的叶子节点则记录了主键值、事务id、用于事务和MVCC的回流指针以及所有的剩余列,其结构大概如下图所示:

这意味着, 主键是和 行数据存储在一起。 还有,非叶子节点存储着主键的ID,这样单独扫描主键的时候,是扫描非叶子 节点,而oracle 的主键,其实 是和 行数据分开的 这是和oracle 最大的不同。

辅助索引 (或者叫二级索引或者一般索引)的优势在于。   (唯一索引、普通索引、前缀索引等都是二级索引)InnoDB在移动行时,无需维护二级索引,因为叶子节点中存储的是主键值,而不是指针。但是查找的过程多了一层, 查找的是时候时候先到的主键,再到数据(但是数据和主键存一起,所以速度也不慢)

因为主键是和 行数据一起存放的,若表的主键不是顺序的id,而是无规律数据,比如字符串,InnoDB无法加单的把一行记录插入到索引的最后,而是需要找一个合适的位置(已有数据的中间位置),甚至产生大量的页分裂并且移动大量数据,在寻找合适位置进行插入时,目标页可能不在内存中,这就导致了大量的随机IO *** 作,影响插入效率。除此之外,大量的页分裂会导致大量的内存碎片。 这也是为什么 mysql 推荐使用 逻辑主键,而不适用业务主键的原因,业务主键不能保证数据的插入是连续的。

主键定位问题叶节点data域保存了完整的数据记录(非叶子节点)聚集索引非叶子节点中,Pointer(索引键值)指向的是ibd文件的Page Offset(File Header中的FIL_PAGE_OFFSET),这样就定位到数据块在ibd文件中的偏移量了。通过关联该ibd文件在 *** 作系统的inode,就能找到磁盘中的具体数据块了。找到数据块,将它读入Innodb buffer pool,然后通过Page Directory(页目录)进行二分查找,来定位到行记录,这个过程中需要使用Record Header中的next_record。

以上就是关于在关系数据库的逻辑设计中,若转换一个1:n的联系为一个关系,则此关系的主键是什么全部的内容,包括:在关系数据库的逻辑设计中,若转换一个1:n的联系为一个关系,则此关系的主键是什么、数据库中如何保存主键内容重复的信息、什么是主键有什么作用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9345889.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存