﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-在Java里泡澡-随笔分类-DB</title><link>http://www.blogjava.net/rickqin/category/42280.html</link><description>~~苦啊~~</description><language>zh-cn</language><lastBuildDate>Wed, 21 Oct 2009 03:47:24 GMT</lastBuildDate><pubDate>Wed, 21 Oct 2009 03:47:24 GMT</pubDate><ttl>60</ttl><item><title>有一次用户问我为什么数据表中都要添加一个业务无关的ID字段</title><link>http://www.blogjava.net/rickqin/archive/2009/10/21/299164.html</link><dc:creator>Rick Qin</dc:creator><author>Rick Qin</author><pubDate>Wed, 21 Oct 2009 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/rickqin/archive/2009/10/21/299164.html</guid><wfw:comment>http://www.blogjava.net/rickqin/comments/299164.html</wfw:comment><comments>http://www.blogjava.net/rickqin/archive/2009/10/21/299164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rickqin/comments/commentRss/299164.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rickqin/services/trackbacks/299164.html</trackback:ping><description><![CDATA[这个问题当时真的不知道怎么回答，只是说Hibernate框架就是这么要求的。后来翻了上学时候的书《数据库系统设计 实现与管理》（第六版）第73页3.3节“表3-4 完整性规则”中要求：<br />
1. 实体完整性<br />
1.1 要求：所有主键标实体都是惟一的，而且主键标的任何部分不可以是空值；<br />
1.2 目的：保证每一个实体会有惟一的标识，并且确保外键标值可以正确的引用主键标值；<br />
1.3 示例：没有发票可以具有重复的编号，也不可以是空值。总之，所有发票由它们的发票编号惟一的标识。<br /><br />
用户发难：人员表中工号是唯一的，为什么不用工号作为主键？<br />
回答：分析了需求后，发现，人员表中工号存在“回收复用”的情况。比如，局长的工号永远都是00001，今年是李局长，明年李局长升迁了、退休了，张局长赴任，工号还是00001。如果用工号作为主键，那么子表引用人员表工号字段，就会出现以下情况：<br /><br />
1、2008年工号为00001的用户操作了100条业务，该工号00001代表李局长；<br />
2、2009年工号为00001的用户操作了80条业务，该工号00001代表张局长。<br /><br />
最后统计工号为00001的用户一共操作了多少业务的时候，会得到工号为00001的张局长操作了180条业务。<br /><br />
因此，工号虽然在库表中唯一，但是他违背了“所有主键标实体都是惟一的”这一完整性要求，因此，不能将工号作为主键。<img src ="http://www.blogjava.net/rickqin/aggbug/299164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rickqin/" target="_blank">Rick Qin</a> 2009-10-21 10:55 <a href="http://www.blogjava.net/rickqin/archive/2009/10/21/299164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>