注册 登录
编程论坛 VFP论坛

搞不懂一对一和一对多的关系

sw3929 发布于 2023-09-25 20:54, 828 次点击
有个问题迷惑:
比如有一个父表和一个子表,在数据工作期里把父表的主键和子表的外键用“关系”按钮连接,然后还可以继续用“一对多”按钮继续关联,这时候打开主表,会出现大量的 * 内容的行。我想问的是这两种方式有何区别?只用“关系”不就连接好了吗?为什么还要有“一对多”,还这么多 * 有什么用?谢谢
15 回复
#2
laowan0012023-09-25 21:35
“一对多”按钮:是个什么按钮?
大量*内容的行,截个图来看看吧
#3
hu9jj2023-09-26 08:27
父表的关键字段对应另一个表的关键字段就是一对一的关系,若是对应多个表的关键字段就是一对多的关系。
#4
easyppt2023-09-26 08:31
只有一句 set relation 建立关系不行,还缺少关键性的一条命令,一时想不起来了。
#5
hu9jj2023-09-26 08:33
好象是还需要一条移动记录的命令,例如skip命令。
#6
gs25367856782023-09-26 09:42
先要从表建立关键字段的索引   
然后选择主表在主表上发起   
 SELECT  主表   
 SET RELATION TO 关键字 INTO 从表  
  
现在的VFP9严格了:如果关键字段是字符型,  
还必需主表与从表的关键字段长度相等。

[此贴子已经被作者于2023-9-26 09:46编辑过]

#7
laowan0012023-09-26 13:56
以下是引用hu9jj在2023-9-26 08:27:16的发言:

父表的关键字段对应另一个表的关键字段就是一对一的关系,若是对应多个表的关键字段就是一对多的关系。


父表关键字段对应另一个表关键字段相同的多条记录算一对一还是一对多?
#8
sdta2023-09-26 15:46
set skip 命令

示例 请参阅



创建表与表之间的一对多关系。



语法



SET SKIP TO [TableAlias1 [, TableAlias2] ...]



参数

TO TableAlias1 [, TableAlias2] ...



指定多个子表的别名。这些子表用来与父表创建一对多关系。表别名之间用逗号分隔。在支持范围的命令( DISPLAY、LIST

等)中,对于子表中每一个对应记录都重复父表的记录。

不带参数的 SET SKIP TO 命令从当前选定工作区的已打开父表中删除该一对多关系,而任何一对一关系仍然有效。一对一关系可以用 SET RELATION TO 删除。



说明



使用 SET RELATION 可以在不同工作区中打开的表之间建立关系。当记录指针在父表中移动时,子表中的记录指针也移动到第一个对应的记录上。SET RELATION 中的关系表达式决定子表中的记录指针移到何处。如果对于父表中每一个记录都建立了一对一的关系,记录指针将移到子表中第一个相匹配的记录上。如果在子表中找不到相匹配的记录,则记录指针移到表尾。

很多情况下,父表中的一个记录通常在子表中有多个记录与之对应。SET SKIP 允许在父表的一个记录与子表的多个记录之间建立一对多关系。当浏览父表时,父表的记录指针将一直保持不动,直到记录指针移过子表中所有相关的记录为止。



要建立一对多关系,首先使用 SET RELATION 在父表与子表之间建立关系。然后发出 set skip 命令创建一对多关系。


[此贴子已经被作者于2023-9-27 12:55编辑过]

#9
gs25367856782023-09-26 15:49
这位朋友你好,你可能对VFP的DBF表不太了解,有二种表:属于数据库的表与自由表
对于数据库中的表,可以建立主索引【数据值不能重复】或者建立普通索引【数据值
可以重复】
对于自由表不能建立主索引,一般建立普通索引或者唯一索引

上面朋友讲的一对一,一对多,都是在数据库表中的术语
两个数据库表的索引字段都是【主索引】,它们之间建立的
就是一对一的联系,建立的方法只要直接用鼠标拖动。
两数据库表的索引字段一个是【主索引】另一个是【普通索引】
就是一对多的联系,建立的方法只要直接用鼠标拖动。

一般的程序员,他们不使用数据库表,而是使用自由表,因此也不研究
一对一,一对多的问题,只是在自由表里建立普通索引就成了
而两个自由表的联系【不是用鼠标拖动】,而是使用SET语句
先要从表建立关键字段的索引   

然后选择主表在主表上发起   

 SELECT  主表   

 SET RELATION TO 关键字 INTO 从表
#10
sw39292023-09-26 20:23
是我没说清楚,如下图:
两个表,总表是父表,数据是子表。设关联是主表的id字段和子表的链接号字段。
问题是:在图中右侧的数据工作期里,还没设关联时,只有关系(R)键可以使用,一对多(T)是不可用的。然后点关系(R)键,设主表的id字段和子表的链接号相联,打开两表后如图左,在主表中定位一条记录,则子表同时显示所有的链接号与id相同的记录,这已经是一对多了。
只有本站会员才能查看附件,请 登录

设好关联后,此时一对多(T)键可用,点之继续设,再打开两表,如下图所示:
只有本站会员才能查看附件,请 登录

主表出现大量*记录,其数量等于子表对应的记录数。右边的数据工作期里的关系图也有了两根连线。
不明白的是这有什么意义,如果说这才是一对多,那么前面的关系(R)就不是一对多了,可分明那也是一对多啊,定位主表一条记录,则子表显示很多记录,不就是一对多吗?
我这所以要搞明白这个问题,是因为我要讲解,但自己还不明白,就没法讲了。
#11
abcde0072023-09-27 10:45
以下是引用sw3929在2023-9-26 20:23:46的发言:


不明白的是这有什么意义,如果说这才是一对多,那么前面的关系(R)就不是一对多了,可分明那也是一对多啊,定位主表一条记录,则子表显示很多记录,不就是一对多吗?
我这所以要搞明白这个问题,是因为我要讲解,但自己还不明白,就没法讲了。


主表只对应一个子表叫一对一,主表对应多个子表才叫一对多。“定位主表一条记录,则子表显示很多记录”,并不是一对多,还是一对一。
也就是说,一对多与一对一都是指的表与表之间的关系的。
#12
sdta2023-09-27 13:04
一对多
1 应该是主表与子表的一对多关系
2 主表的一条记录对应于子表的多条记录的一对多关系。

one-to-many relationship(一对多关系)

表之间的一种关系,在这种关系中,主表中的每一个记录与相关表中的多个记录相关联(每一个主关键字值在相关表中可出现多次)。

parent table(父表)

在一对一或一对多关系中的主表或主控表。请参阅“子表”、“主表”、“相关表”。

primary table(主表)

一个表,其中的各列在一对一或一对多关系中被其他表所引用。
#13
gs25367856782023-09-27 14:18
朋友的图片已经看过了,估计你是在用VFP6的版本。看下我VFP9的图片
只有本站会员才能查看附件,请 登录

图片中主表KK0与第一从表KK建立了一对多关系

朋友你第一次设置的时候,最下面的【一对多】按钮不可用,你使用了
【关系】按钮,建立起了主表到第一从表的一对多的关系。这些论述都对
接下来【一对多】按钮可用了,你使用它应当是建立主表到第二从表的
关系,决不应当仍然是主表与第一从表关系,因为你重复了、
只有本站会员才能查看附件,请 登录

图片中主表KK0与第一从表KK建立了一对多的关系
又与第二从表AC建立了一对多的关系。
主表中选择一个BJ字段值,无论是第一从表还是第二从表都会跟着变化

[此贴子已经被作者于2023-9-27 14:39编辑过]

#14
mywisdom882023-09-27 19:58
显示***,不就是字段长度不够吗
#15
sw39292023-09-28 20:36
仍是有问题:
有朋友说是一对多是表间的关系,一父表两子表是一对多,但是我可以用下图中的“关系”按钮就完成了一父带二子,没有使用“一对多”按钮。
而在一父带二子之后,点“一对多”,则如下图中要求把两表加到右侧“选定别名”里。

只有本站会员才能查看附件,请 登录

如果加入后,则再如下图所示为两道线,此时打开主表后就很多*。
只有本站会员才能查看附件,请 登录

如果在图一中已经完成了一父带二子,那么图一下方的“选定别名”还有什么用?“一对多”按钮有什么用?
#16
gs25367856782023-09-29 13:48
朋友你悟性慢了:上面已经讲过了,无论是一对一还是一对多,都是数据库中的二个表之间的关系
如果是主索引到主索引,称一对一关系
如果是主索引到普通索引,你一对多关系

你的图片中的一对多按钮,并不是一对多关系为
而是主表与多个从表的关系!

实际上你讲的是VFP6的知识,在VFP9中已经不再出现图片中的一对多按钮了。
随着VFP9的普及,现在使用VFP6的人已经很少了。我因为以前也上课教育过
VFP6,所以知道点,你这是在宣讲两个表之间建立临时的关系。

1