Tuesday, October 27, 2009

映射与primary key, foreign key

一对多, 多对多, 多对一, 一对一. 这是什么?

这种是什么关系? 在初中数学中有一种叫: 映射 的概念.

定义:设A和B是两个非空集合,如果按照某种对应关系f,对于集合A中的任何一个元素,在集合B中都存在唯一的一个元素与之对应,那么,这样的对应(包括集合A,B,以及集合A到集合B的对应关系f)叫做集合A到集合B的映射(Mapping),记作f:A→B。

这个"对应关系f"又是一个忽悠级的概念. 又如, money与owner就是一种"对应关系". 那么girls与me有没有关系呢? 当然了! 当me为mine时就很明显了!

重要的几句话:
1. 映射,或者射影,在数学及相关的领域经常等同于函数
 * f就是这个函数. A的与B只不过是stdout与stdin罢了
2. 对应的唯一性:定义域中的一个元素只能与映射值域中的一个元素对应
 * 如图:
图1不是中的集合A到集合B不形成映射! 因为这不是唯一性!

那么为什么在数据库中常出现"一对多"的情况呢?
映射是有方向的, 上面的图(1)如果方向从B到A, 使用f = N^2这个法则的话. 就形成了集合B到集合A的映射. 就是说"一对多"的另一个方向是"多对一"

"多对多"是怎么解释?
从django的ORM实现ManyToMany关系类型就大概知道了:

左边的图是"多对多"的情况, 等价于右边的图. 增加一个中间集合, 关系被分成两个大圆上. 结果是: "一对多 => 多对一".

所以, 映射有二种:
1. 一对一
2. 一对多

primary key 和 foreign key又是何方神圣?

1. primary key就是一个集合中, 为每个元素分配一个唯一的序号. f(集合, pk)一定可以得到唯一的元素
2. foreign key就是当某一集合的元素的primary key序号在另一集合中作为元素值时对这个序号(数字)的称呼. 与上面一样, f(集合, pk)也是可以得到唯一的元素. 如果得到的元素又是另一个集合的primary key呢? 于是: f2(集合2, f1(集合, pk))也是有唯一的元素的. 这样就可以把N个集合的关系表达出来.

primary key应该放在哪个集合中?

1. 对于"一对一"的情况, 放在哪个集合都是可以形成映射的

2. 对于"一对多"的情况. primary key应该存在"多"的一端.

数据库技术中, 使用primary key 与 forgein key概念来完成了表与表的相引用, 也增加了一些约束, 使key(为某一数字)拥有更多功能. 例如django文档这样写的:
When Django deletes an object, it emulates the behavior of the SQL
constraint ON DELETE CASCADE -- in other words, any objects which
had foreign keys pointing at the object to be deleted will be deleted
along with it.

虽然foreign key也是一个数字, 但给以它更多的意义.




BTW: 找数学知识文档没有经难. 比较难找.
http://baike.baidu.com/view/21249.htm

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.