数据库主键的故事

作者:李战 来源:软件真谛 时间:2008-05-31 07:50:00 

1969年8月8日,在北京协和医院降生了一个漂亮的小女孩。接生的阿姨说,她的声音这么大,好象想要全世界的人都听到。

后来,她的父亲为她取了一个很好听的名字,叫“王菲”。于是,所有的小朋友就叫她“王菲”,“王菲”就是她童年的主键。

在她上初二的时候,认识了二班另一个叫“王菲”的同学,而且和她同一天生日。不过,同学们常常将她俩弄错,后来,就分别叫她们“大王菲”和“小王菲”。“大王菲”就是她在同学们心目中的主键。

在大王菲18岁的那一年,她领到了她的身份证。从此,她有了新的身份标识“100321690808022”,这一标识可以唯一区别中国大陆的每一个人。同时,原来二班的“小王菲”也领到了她自己的身份证,“100321690808006”。于是,人们就可以用身份证号,唯一标识两个“王菲”了。身份证号就是她成年后的主键。

由于她的歌唱的非常好,没多久就成了歌星。后来她去了香港发展,娱乐公司非要将她的名字更改为“王靖雯”,虽然她并不喜欢这个名字,但为了事业的发展还是同意了。“王靖雯”就成了她在娱乐圈里的主键。

“王靖雯”的歌打动了许许多多的歌迷,很快就成了歌坛天后。歌迷们将“王靖雯”这一主键与无数条动听的歌曲记录关联在了一起,并形成了一个庞大的歌迷数据库。

没多久,王靖雯和一个弹电吉他的小子相爱了。那小子说,还是“王菲”这个名字好听,于是,“王靖雯”又变回“王菲”了。主键被那小子修改了,这下麻烦大了。歌迷们都糊涂了,是将她的歌关联到“王菲”还是“王靖雯”呢?这一主键的修改,导致歌迷数据库的一次大混乱。

再后来呢,她和那个弹电吉他的小子结婚了,香港政府将他们的身份证号码,用结婚证书关联起来。这本也算一桩好事,可是,月老在酒醒之后发现了这一错误,就将关联的记录删除了。阴差阳错,命运使然,她和那个弹电吉他的小子只好分手了。

但是,正如接生的阿姨说的那样,她的声音的确让全世界的人都听到了!

讲完这个故事之后,我们是否能领悟到数据库设计的一些哲理呢?

什么是主键?

关系数据库说,为了唯一区分表的每一行记录,必须为表确定一个主键。主键可以是一个或多个列组成,这些主键列的值不能重复。主键是两个表进行关联的基础,所谓“关系”体现的是一个表的字段与另一个表的主键的关联。

在日常的应用项目开发中,我们常常都会面临“该拿什么字段来做主键”的难题。

用名字做主键?一班的“王菲”和二班的“王菲”可能重复。

用身份证号做主键?在大陆也许不会重复,去香港后,人家却不认。本不相信第二代身份证号会重复,但俺的一位同事正好撞上!

同样,主键值的更新也是麻烦事儿。“王靖雯”变成“王菲”那段日子,货架上一张唱片是王靖雯的,另一张又是王菲的,许多歌迷还以为又有新人出现了。

请不要说可以级联更新,将你那个做主键的字段加长两位试试?想当年,当身份证号从15位增加到18位时,给银行、证券、政府、企业...等多条战线上的兄弟们制造了怎样的痛苦啊!

为什么会出现这些问题呢?

原因就是:错误地把对象属性当作对象标识!

对象属性和对象标识都是对象数据库中的概念。

什么是对象属性呢?

就是业务逻辑上涉及的任何可变信息,什么“姓名”、“性别”、“身份证号”、“订单号”...通通都是对象属性。对象属性总会变化的,只是有些变得快,有些变得慢而已。

对象标识是啥?就是唯一区分数据对象的鉴别符,对象标识存在的唯一目的就是区分对象,除此之外没有任何业务逻辑上的意义。

不管王菲的属性值怎样变化,但王菲还是王菲,不是二班的那个“王菲”。也就是说,王菲的灵魂未变,她是不会改变的,就象哲学上所说的“不以人的意志为转移”。这种唯一表示对象本身的东西,就是对象标识!

对象标识是唯一的。也就是说,即使两个对象,他们的属性完全一样,但它们的对象标识是不同的。毕竟,同名同姓甚至同一天出生的大王菲和小王菲是两个不同的人。

对象的标识是永恒不变的。一旦对象产生,它的标识就自然地、唯一地产生了。尽管王菲换了名,身份证号也变过,但王菲的对象标识未变。即使到了下个世纪,她的对象标识也将依然存在于歌迷们的们的心中。

对象的标识是描述关系的基础。王菲唱的歌是王菲唱的,不是初二二班的那个“王菲”唱的。王靖雯唱的歌就是王菲唱的歌,有的歌迷只将歌曲和歌手的人名关联起来,难怪会出混乱。香港政府也犯相同的错误,将王菲的身份证号码这一内部属性,跟那个弹电吉他的小子关联起来,也许就是命运的错误。

标签:主键,数据库,随机
0
投稿

猜你喜欢

  • 安装完Python包然后找不到模块的解决步骤

    2022-01-23 05:38:10
  • Vue之计算属性详解

    2024-04-27 15:57:27
  • 你的网站使用了微格式了么

    2009-05-21 12:10:00
  • pytorch DataLoader的num_workers参数与设置大小详解

    2022-12-22 12:15:58
  • Django 使用VScode 创建工程的详细步骤

    2023-02-01 02:49:19
  • 如何利用Python实现一个论文降重工具

    2021-02-04 08:11:28
  • 如何批量消除网页超级链接上的“虚线框”

    2008-10-15 12:55:00
  • python通过Seq2Seq实现闲聊机器人

    2021-09-02 13:39:15
  • MySQL 5.0 数据库新特性的存储过程

    2007-10-24 19:45:00
  • Python实现读取txt文件中的数据并绘制出图形操作示例

    2021-07-21 17:01:15
  • 运用Python的webbrowser实现定时打开特定网页

    2021-12-15 23:07:02
  • python可视化爬虫界面之天气查询

    2022-09-24 07:34:54
  • 在Python中用keys()方法返回字典键的教程

    2023-08-20 17:45:39
  • Python Django教程之实现天气应用程序

    2022-03-22 23:02:43
  • ASP分页函数

    2009-07-06 12:41:00
  • python函数指定默认值的实例讲解

    2021-07-20 14:05:01
  • 利用python画一颗心的方法示例

    2021-06-04 01:14:33
  • python PyVCF文件处理VCF文件格式实例详解

    2021-11-14 02:23:16
  • 基于Python实现有趣的象棋游戏

    2022-06-11 20:37:15
  • python PIL模块的基本使用

    2022-08-28 16:35:19
  • asp之家 网络编程 m.aspxhome.com