最佳数据库规划(转)ITeyealibaba - 凯发娱乐

最佳数据库规划(转)ITeyealibaba

2019-02-01 10:43:10 | 作者: 辰宇 | 标签: 规划,数据库,事务 | 浏览: 6894


最佳数据库规划(转)

1,主键
自添加主键,如ORACLE的序列或是UUID算法或是自己制造一个生成仅有数字的类,主键无含义性。
避免用复合主键。
双主键,即一个无含义的ID字段作主键,如用序列。另一个则是事务编号NO作为主键(如产品号,用户代码等。)由于如ORACEL只能有一个主键,这个则是一个UNIQUE KEY。在不能彻底断定事务NO的含义时,界说成VARCHAR2,当然这或许影响功用。

关于事务编号NO,不作为主键,首要有如下原因:用一个序列“数字型”作为主键,功用更好。二是关于事务编码或许存在编码规矩在运转后期会有改动,以及长度估量禁绝等。特别比如用身份证作为主键就有许多问题,比如在曾经15时都是数字,就规划成NUMBER(15),但是当添加到18位时,长度不行,更糟糕的是18位身份请中或许存在字母。数据类型改动是一个更大的问题。又如,关于定单,订单编号在刚开始的时分咱们一切顺利,后来客户说“订单能够报废,偏从头生成订单,而且订单号要坚持原订单号共同”,这样本来的主键就面对风险了。
双主键还有一个凭借操作系统的规划,删去一个PETER的用户,后来又来一个PETER,则这两个人应该是有不同的权限(在授权表中)。但是假如授权表以用户NO作为相关用户的键,则后来的人就有了本来那个人的权限了,是不对的。(这儿也说明晰下面会说到的,在不是万万断定的状况下,不要设置外键,或是说删去等的约束,关于外键的运用,是一个能够研讨的问题。)
复合主键在作主动处理,如页面批量删去等或是编码共用性上就不便利了。当然功用也没有单主键好。假如运用Hibernate等O/R东西的话,参阅其映射比如,关于简略的单为了表达多对多的联系,则只要两个相对就表的ID,则此表无其它意思,能够不需求上面说到的无含义的ID作为主键了。但这种较少,看定单/定单条目/产品的比如中,将产品条目作为定单的SET/LIST完结的话,如同定单条目中则不能加id标识了。(不过,作为事务表规划应该是主,而 HIBERNATE应该是末端,不引荐运用HIBERNATE来推进事务数据库规划了。因而,HIBERNATE中的id标识首要是作为 HIBERNATE的标识,与我上面的讲到的表规划中的ID是或许分隔的,只不过关于上面说到的状况,刚好能够很好的合作吧。此种状况下,咱们假如用 HIBERNATE,也能够将ID字段作为LIST/SET的composite-element一个特点property来处理,仅仅不能运用 Hibernate class id标识的generator罢了,即在插入时要自己赋值,也能够编程中获得如sequence或UUID等,坚持数据库层的共同性)


对主键的挑选:一是事务编号作主键,会有如上说到的问题。二是无含义主动编号,如序列SEQUENCE。三是MAX加一,有时用事务编号也是如此。假如直接用本表来完结,max(NO)+1,当数据添加后,会严重影响功用。四是克己加一,是对MAX加一的一种改善完结,用一表编号操控档NO_CTRL来完结的。在后面会谈到,这也是一个比较可研讨的出题。首要用来生成事务编码,且带有事务编码规矩。五是UUID/GUID,由于UUID/GUID也是无含义,且无序的,而且更长,相关于SEQUENCE来说,是没有优势的。(不过也有特殊状况,是否需求一切的表或部分表的主键仅有,如在一次规划的共同的审阅流程,审阅规矩的时分,则以定单,收购单等的一主键ID作为审阅表的外键) 如在Hibernate中则能够定制就很好。


2,命名
表,字段,视图等都以_下划线分隔各个含义单词,这样便利从数据耐久向目标的转化,参照JAVA命名规矩,这样例如用JB或自己写程序转化则以_分隔组成JAVA特点首字母大小写等。
表名/视图名按你的事务模块或是T/V等为前缀加以区别。

从耐久到目标类型,table到java 类的转化最好悉数规矩共同,(除非生成JAVA后或许还需求添加编程顶用的特点),最好的办法是用东西生成,如用JB生成CMP相同。当然如用HIBERNATE则也或许是反向的,由JAVA类规划(UML),运用xDoclet等生成hbm.xml,再依据hbm.xml导出数据库DDL。
这种彻底规矩相同,或许关于在运用如反射等作编码完结一切的表的某一功用时很有用。

3,一般在规划时一切表都应该有如下字段(除小数装备性表,如下面说到的no_ctrl,在你不断定时也能够加上,先不必即可),
ID:NUMBER 主键
NO/复合字段:事务主键(仅有KEY)
CREATE_USR:创立人(NOT NULL)
CREATE_TIME:创立时刻(NOT NULL)
MODIFY_USR:最终修正人
MODIFY_TIME:最终修正时刻
DELETE_FLAG:0/1,T/F,TRUE/FALSE 删去标志(default F NOT NULL)
DELETE_USR:删去人
DELETE_TIME:删去时刻
VERSION:NUMBER default 1 版别(NOT NULL)
在规划时或许还没有要求到删去时只作符号,而是直接删去,或许是客户还没想到或提出。但作规划人员是应该想到或许的扩展的。用户达观确定的VERSION也相同,或许在开始时还没有用到,但也应是一种挑选确定的办法的。
能够挑选以上的时刻/版别等是选用编程来完结(运用层来赋值)或是选用数据库层的TIRGGER来完结。

在规划字段时,最好想想是否有DEFAULT值。加上注释,特别是如DELETE_FLAG这样的字段。

4,字段类型(还没写,首要指如时刻类型,有的是用char(8)20010101 或char(10)2001-01-01等。不有标志,如状况,类型等,是用char仍是number呢?(请我们宣布这关于数据库层及编程便利性上给个定见。)

5,关于事务编码或是克己编号加一的规划及考虑。

如上说到能够用克己编号加一来规划主键。但一起也讲到最好是别设一无含义的纯主键。所以一般是用克己来规划“事务编号”,由于事务编号或许有前后缀,且一般要求次序,接连等。所以如下首要讨论一下事务编码的问题:
a,编号接连问题,运用MAX + 1,假如在履行INSERT句子时,直接运用则必定确保多用户接连。即INSERT INTO IN_BOX VALUES(MAX(IN_NO)+1,...)。假如有前后缀,假如规矩必定,也能够运用如ORACLE的SUBSTR等来完结。假如在编程中是先用一个SELECT MAX(IN_NO)...,再履行INSERT,则会呈现多用户时后者重复的状况。运用此更大的问题是上面讲到的功用问题,所以不引荐。
b,运用克己一个NO_CTRL表来保存(注:如ORACLE的序列在内部听说也是如此来完结的),根本的NO_CTRL是这样的,NO_CTRL (ID,TABLE_CODE,COLUMN_CODE,CURR_NUM)。根本作法是在完结插入时加1。(或许关于你的规划中某个表存的数据是单据,单据根本数据项相同,但是不同品种的单据编号不同,各自接连时,则此表要作相应修正,假如要满意相似一切状况或许得更多考虑了)。一般会有一个专门的类来完结获得NO的功用。
c,关于某些事务,特别是ERP中的单据等,是在用户录入界面时就得显现单据号,这个问题比较复杂。最简略的是页面生成下一个NO,用 noCtrl.nextNo(table,column),页面和其它录入项相同传入后台进行数据新增。noCtrl的nextNo的完结是select curr_no+1,update curr_no+1,即取回并加一更新。此办法有很严重的问题是就算是单用户也不能确保事务编号接连,由于在取回时就更新了,假如事务履行新增呈现异常,则此编号则浪费了。所以应该对此办法加以改善,首要是选用“推迟更新”来完结。即nextNo()办法是只履行查询,回来下一个编号,显现在页面上,在后台履行事务新增时,在一个事务中,履行更新加一的动作。留意考虑多用户的状况,事务新增中要从头履行获得号码(由于在你履行取回号到履行新增中心或许已被另一用户更新了,你的编号已被运用了)。所以你的事务新增会是这样的,tx.begin(),ctrlNo.nextNo(table,column), insert(事务),ctrlN.update(),tx.end().关于ctrlNo.update()为了更进一步确保共同,能够带上where currNo=currNo。如是达观锁加version相同。一起或许存在取加一个号要接连用多个的状况,最好则选用加锁读取来完结。
d,上面首要是讲到事务编号的接连,是数字。但一般事务编号并不仅仅数字,而是一个有前后缀,且按必定规矩生成的。所以选用NO_CTRL也是很好的。这样或许会是这样的,NO_CTRL(ID,TABLE_CODE,COLUMN_CODE,PREFIX,POSTFIX,CURR_NUM, NUM_LEN)。即加上前,后缀规矩和数字号长度。

Trackback: https://tb.blog.csdn.net/TrackBack.aspx?PostId=428282
文章引证自:
分类:数据仓库
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2
  • 3
  • 4

    union联合查询guojizaixian

    成果,数据,排序
  • 5

    TIME快报

    效劳,状况,修正
  • 6

    SQL试题环球

    用户,时刻,信息
  • 7
  • 8
  • 9

    asdfasdfITeye头条

    用户,权限,指令
  • 10

    SQL一招ITeyesohu

    字符串,标题,检索