数据库表设计关于"主键"选择乱谈
2007-03-15 13:20
435 查看
现在做项目总离不开主流的关系数据库, 当然也就免不了对数据库表的设计,这里如何对数据库进行设计当然还轮不到我这个半斤八两的人在这里高谈阔论,我只想谈谈我对数据库主键选择的一些看法.
一些比较老一点的设计师都有一个习惯,那就是喜欢把业务上唯一的字段或复合字段作为数据库表的主键,所谓业务主键,打个比方,数据库表有姓名,性别 ,年龄 ,电话,四个字段,在这里,假设姓名是唯一的,那么,我们就把姓名作为数据库的主键.但是这个设计有一个问题,那就是,假设需求突然变化,可以允许同名出现,那么就不得不重新设计主键,这种改动主键的做法可能会对上层应用伤胫动骨.当然一般来讲,主键的变动意味着业务的变动,一般也会设计到应用重新设计. 但是从另外一个角度来讲,我们何不开始就预防呢,如果采用和业务无关的主键,那么不管以后业务如何动,我们的主键关系至少可以不动,岂不是更好.同时,业务上的哪些字段需要唯一,可以通过定义约束来实现,如果采用O/R映射,那么可以将业务唯一通过对equals()和hashCode()进行覆盖解决.
一些比较老一点的设计师都有一个习惯,那就是喜欢把业务上唯一的字段或复合字段作为数据库表的主键,所谓业务主键,打个比方,数据库表有姓名,性别 ,年龄 ,电话,四个字段,在这里,假设姓名是唯一的,那么,我们就把姓名作为数据库的主键.但是这个设计有一个问题,那就是,假设需求突然变化,可以允许同名出现,那么就不得不重新设计主键,这种改动主键的做法可能会对上层应用伤胫动骨.当然一般来讲,主键的变动意味着业务的变动,一般也会设计到应用重新设计. 但是从另外一个角度来讲,我们何不开始就预防呢,如果采用和业务无关的主键,那么不管以后业务如何动,我们的主键关系至少可以不动,岂不是更好.同时,业务上的哪些字段需要唯一,可以通过定义约束来实现,如果采用O/R映射,那么可以将业务唯一通过对equals()和hashCode()进行覆盖解决.
相关文章推荐
- 我把Black_Cat与Walaqi等关于"设计模式"之"工厂方法""抽象工厂"的讨论整理如下,以方
- 关于使用<s:property value="">形式取得 数据库图片地址的注意事项
- 解决ASP.NET连接Oraclei数据库出现"无法加载DLL(oci.dll)"异常
- 数据库设计---关于建表的时候选择横表和竖表(纵表)的一点思考
- 关于Symbian的"程序已经关闭"错误
- 解决关于SQL2005注册连接SQL2000查看表值函数时的"属性QuoteIdentifierStatus不可用于UserDefinedFunction"[dbo].[函数名]"……”的提示
- 关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”
- "家园"的详细设计(4)
- 在VS2005中报"无法添加数据库连接 该项目不适于在指定状态下使用"的解决办法
- 关于在英创em9161板上使用ADO.net连接远程数据库提示 “无法找到 PInvoke dll"dbnetlib.dll"”问题解决方法
- "无法修改表,超时时间已到" 增加设计器 事务的执行时限
- 如何根据"需求及功能需要"去选择相关的"材料、型号、技术"的思考
- sql2000备份的数据库还原到sql2005后,选择“数据库关系图”提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象"的解决方法
- CLR via C# 读书笔记(三)关于"is" 和"as"操作符
- "SQL Server 2000"数据库的备份与还原
- 关于stm32 APB总线上的"接口时钟使能"与"外设时钟使能"
- "浏览文件夹"选择对话框
- 关于使用"/"来 dispatcherServlet 的url-pattern带来的问题
- "围观"设计模式(10)--创建型之原型模式(Prototype Pattern)
- sql-"无法删除数据库,因为该数据库当前正在使用"问题解决