查看: 427095|回复: 14

主键用sequence自增是好的设计实践么?

[复制链接]
论坛徽章:
9
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00奥运会纪念徽章:篮球
日期:2012-10-12 15:12:022013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-30 16:34:482015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39秀才
日期:2015-09-14 10:08:30
跳转到指定楼层
1#
发表于 2014-3-3 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经常看到这种观点,但我们这边的项目很少这么用,设计表基本上还是用带业务属性的东西作为主键,比如用户的电话号码等。

用序列或者其它自增的无业务属性的东西作为主键,到底有啥好处呢?

论坛徽章:
286
生肖徽章2007版:虎
日期:2014-06-23 20:17:04生肖徽章2007版:虎
日期:2014-09-18 12:50:09生肖徽章2007版:虎
日期:2014-11-14 14:21:28生肖徽章2007版:虎
日期:2014-06-23 20:42:17生肖徽章2007版:虎
日期:2014-06-23 20:42:17紫水晶
日期:2017-04-06 13:47:28红宝石
日期:2017-04-06 13:47:15秀才
日期:2017-04-06 13:42:06秀才
日期:2017-04-06 13:41:23秀才
日期:2017-03-28 15:59:38
2#
发表于 2014-3-3 10:06 | 只看该作者
我接触过的oracle大项目,基本不会用无业务属性的东西作为主键。

但是接触过的几个sqlserver项目,倒是自增id作为主键非常常见,难道是因为sqlserver自增id的实现太简单,所以用的多???

使用道具 举报

回复
招聘 : 多个岗位招聘
论坛徽章:
33
2010广州亚运会纪念徽章:跆拳道
日期:2010-11-22 15:42:39灰彻蛋
日期:2012-05-16 13:17:56参与WIN7挑战赛纪念
日期:2012-05-24 10:37:35茶鸡蛋
日期:2012-05-28 17:27:32灰彻蛋
日期:2012-06-13 18:48:14双黄蛋
日期:2012-06-14 14:32:02奥运会纪念徽章:帆船
日期:2012-07-10 09:43:29奥运会纪念徽章:足球
日期:2012-08-17 09:17:32奥运会纪念徽章:帆船
日期:2012-07-26 15:46:49奥运会纪念徽章:赛艇
日期:2012-08-20 16:23:58
3#
发表于 2014-3-3 11:29 | 只看该作者
pk 主要是确保唯一性
db pk 一般和应用pk 是一致的

使用道具 举报

回复
论坛徽章:
19
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292015年新春福章
日期:2015-03-04 14:53:16优秀写手
日期:2014-03-19 06:00:24马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:08比亚迪
日期:2013-10-23 21:35:02ITPUB社区12周年站庆徽章
日期:2013-10-08 14:54:39茶鸡蛋
日期:2013-07-25 19:48:40灰彻蛋
日期:2013-05-24 09:42:412013年新春福章
日期:2013-02-25 14:51:24
4#
发表于 2014-3-3 12:11 | 只看该作者
hh7yx 发表于 2014-3-3 10:06
我接触过的oracle大项目,基本不会用无业务属性的东西作为主键。

但是接触过的几个sqlserver项目,倒是自 ...


其实 oracle 的sequence用不起来也不复杂呀。
除了这个原因外是否还有其他的原因?

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
5#
发表于 2014-3-3 12:35 | 只看该作者
主键就要终生不变且不重复
许多业务东西理论上不重复,实际上重复,如组织机构代码和身份证号,就不能用

使用道具 举报

回复
论坛徽章:
0
6#
发表于 2014-3-3 15:53 | 只看该作者
主键只要保持唯一性即可。关于业务属性一般不建议作为主键,确实有重复的可能性,而且有些特殊属性涉及个人隐私。个人觉得如果涉及优化或者整体数据结构调整,可以随意变动业务列,不用顾忌此列是否是主键。

使用道具 举报

回复
论坛徽章:
2
2014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
7#
发表于 2014-3-3 18:58 | 只看该作者
业务主键,逻辑主键

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24ITPUB社区千里马徽章
日期:2013-06-09 10:15:34宝马
日期:2013-09-17 17:12:562014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31马上加薪
日期:2014-04-25 19:34:55
8#
发表于 2014-3-3 23:56 | 只看该作者
关注此贴

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
9#
发表于 2014-3-3 23:59 | 只看该作者
序列号做主键的好处是,它只是一个无意义的数字。既然无意义就不会被修改(比如发现录入错误的修改),主键必须是终生不变的。
如果业务主键能够保证不被修改,也可以使用。

使用道具 举报

回复
论坛徽章:
18
奥迪
日期:2014-01-23 17:13:08喜羊羊
日期:2015-05-29 07:20:492015年新春福章
日期:2015-03-06 11:59:472015年新春福章
日期:2015-03-04 14:55:13马上加薪
日期:2014-10-22 11:08:29itpub13周年纪念徽章
日期:2014-10-10 07:09:53生肖徽章:蛇
日期:2014-06-19 17:10:12生肖徽章:龙
日期:2014-06-19 17:10:12 2014年世界杯参赛球队: 德国
日期:2014-06-13 10:14:37优秀写手
日期:2014-05-14 06:00:20
10#
发表于 2014-3-4 02:12 | 只看该作者
In Oracle 12C, there're two ways to provide AutoNumber or Identity functionality of other database engines like SQL Server.

(1) Identity Columns

The 12c database introduces the ability define an identity clause against a table column defined using a numeric type. The syntax is show below.

GENERATED
[ ALWAYS | BY DEFAULT [ ON NULL ] ]
AS IDENTITY [ ( identity_options ) ]

Example:
CREATE TABLE test(
  id          NUMBER GENERATED ALWAYS AS IDENTITY,
  text       VARCHAR2(100)
);

INSERT INTO TEST( TEXT) VALUES ('Test Line#1');
INSERT INTO TEST( TEXT) VALUES ('Test Line#2');

SELECT * FROM TEST;


(2) DEFAULT Values Using Sequences

In Oracle 12c, it is now possible to specify the CURRVAL and NEXTVAL sequence pseudocolumns as the default values for a column.

CREATE SEQUENCE t1_seq;

CREATE TABLE t1 (
  id          NUMBER DEFAULT t1_seq.NEXTVAL,
  description VARCHAR2(30)
);

INSERT INTO t1 (description) VALUES ('DESCRIPTION only');
INSERT INTO t1 (id, description) VALUES (999, 'ID=999 and DESCRIPTION');
INSERT INTO t1 (id, description) VALUES (NULL, 'ID=NULL and DESCRIPTION');


Ref:
http://www.oracle-base.com/artic ... in-oracle-12cr1.php
http://www.oracle-base.com/artic ... ancements-12cr1.php

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表