有极速快乐十分吗|极速快乐十分走势图|

如何设计数据库的主键

主键的设计是非常重要的
服务器君?#36824;不?#36153;了167.076 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

有些朋友可能不提倡数据库表必须要主键,但在我的思考中,觉得每个表都应该具有主键,不管是单主键还是双主键,主键的存在就代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,本记录的修改与删除,当我们没有主键时,这些操作会变的非常麻烦。

我强调主键不应该具有?#23548;?#30340;意义,这可能对于一些朋友来说不太认同,比如订单表吧,会有“订单编号”字段,而这个字段呢在业务?#23548;?#20013;本身就是应该具有唯一性,具有唯一标?#37117;?#24405;的功能,但我是不推荐采用订单编号字段作为主键的,因为具有?#23548;?#24847;义的字段,具有“意义更改”的可能性,比如订单编号在刚开始的时候我们一切顺利,后来客户说“订单可以作?#24076;?#24182;重新生成订单,而且订单号要保持原订单号一致?#20445;?#36825;样原来的主键就面临危险了。因此,具有唯一性的?#23548;?#23383;?#25105;?#20195;表可以作为主键。因此,我推荐是新设一个字段专门用为主键,此主键本身在业务逻辑上不体现,不具有?#23548;?#24847;义。而这种主键在一定程序增加了复杂度,所以要?#37038;导?#31995;统的规模大小而定,对于小项目,以后扩展不会很大的话,也查允许用?#23548;?#21807;一的字段作主键的。

我们现在在思考一下,应该采用什么来作表的主键比较合理,申明一下,主键的设计没有一个定论,各人有各人的方法,哪怕同一个,在不同的项目中,?#19981;?#37319;用不同的主键设计原则。

  1. 编号作主键
  2. 此方法就是采用?#23548;?#19994;务中的唯一字段的“编号”作为主键设计,这在小型的项目中是推荐这样做的,因为这可以使项目比较简单化,但在使用中却可能带来一些麻?#24120;?#27604;如要进行“编号修改”时,可能要涉及到很多相关联的其他表,就象黎叔说的“后果很?#29616;亍?还有就是上面提到的“业务要求允许编号重复时?#20445;?#25105;们再那么先知,都无法知道业务将会修改成什么?

  3. 自动编号主键
  4. 这种方法也是很多朋友在使用的,就是新建一个ID字段,自动增长,非常方便也满足主键的原则,优点是:数据库自动编号,速度快,而且是增量增长,聚集型主键按顺序存放,对于检索非常有利;数?#20013;?#30340;,?#21152;每占?#23567;,?#30528;?#24207;,在程序中传递也方便;如果通过非系统增加记录(比如手动录入,或是用其他工具直接在表里插入新记录,或老系统数据导入)时,非常方便,不用担心主键重?#27425;?#39064;。

    缺点:其实缺点也就是来自其优点,就是因为自动增长,在手动要插入指定ID的记录时会显得麻?#24120;?#23588;其是当系统与其他系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突(前提是老系统也是数?#20013;?#30340;);如果其他系统主键不是数?#20013;?#37027;就麻烦更大了,会导致修改主键数据类型了,这?#19981;?#23548;致其他相关表的修改,后果同样很?#29616;?就算其他系统也是数?#20013;?#30340;,在导入时,为了区?#20013;?#32769;数据,可能想在老数据主键前统一加一个“o”(old)来表示这是老数据,那么自动增长的数?#20013;?#21448;面临一个挑战。

  5. Max加一
  6. 由于自动编号存在那些问题,所以有些朋友就采用自己生成,同样是数?#20013;?#30340;,只是把自动增长去掉了,采用在Insert时,读取Max值后加一,这种方法可以避免自动编号的问题,但也存在一个效率问题,如果记录非常大的话,那么Max()?#19981;?#24433;响效率的;更?#29616;?#30340;是并发性问题,如果同时有两人读?#36739;?#21516;的Max后,加一后插入的ID值会重复,这已经是有经验教训的了。

  7. 自制加一
  8. 考虑Max加一的效率后,有人采用自制加一,也就是建一个特别的表,字段为:表名,当前序列值。这样在往表中插入值时,?#21364;?#27492;表中?#19994;较?#24212;表的最大值后加一,进行插入,有人可能发现,也可能会存在并发处理,这个并发处理,我们可以采用lock线程的方式来避免,在生成此值的时,先Lock,取到值以后,再unLock出来,这样不会有两人同时生成了。这比Max加一的速度要快多了。但同样存在一个问题:在与其他系统集成时,脱离了系统中的生成方法后,很麻烦保证自制表中的最大值与导入后的保持一致,而且数?#20013;?#37117;存在上面讲到的“o”老数据的导入问题。因此在“自制加一”中可以把主键设为字符型的。字符型的自制加一我倒是蛮推荐的,应该字符型主键可以应付很多我们意想不到的情况。

  9. GUID主键
  10. 目前一个比较好的主键是采用GUID,当然我是推荐主键还是字符型的,但值由GUID生成,GUID是可以自动生成,也可以程序生成,而且键值不可能重复,可以解决系统集成问题,几个系统的GUID值导到一起时,也不会发生重复,就算有“o”老数据也可以区分,而且效率很高,在.NET里可以直?#37038;?#29992;System.Guid.NewGuid()进行生成,在SQL里也可以使用 NewID()生成。

优点

  • 同 IDENTITY 列相比,uniqueidentifier 列可以通过 NewID() 函数提前得知新增加的行 ID,为应用程序的后续处理提供了很大方便。
  • 便于数据库移植,其它数据库中并不一定具有 IDENTITY 列,而 Guid 列可以作为字符型列转换到其它数据库中,同时将应用程序中产生的 GUID 值存入数据库,它不会对原有数据带来影响。
  • 便于数据库初始化,如果应用程序要加载一些初始数据, IDENTITY 列的处理方式就比较麻?#24120;?#32780; uniqueidentifier ?#24615;?#26080;需任何处理,直接用 T-SQL 加载即可。
  • 便于?#38405;?#20123;对象或常量进行永久标识,如类的 ClassID,对象的实例标识,UDDI 中的联系人、服务接口、tModel标识定义?#21462;?/li>

缺点

  • GUID 值较长,不容易记忆和输入,而且这个值是随机、无顺序的。
  • GUID 的值有 16 个字节,与其它那些诸如 4 字节的整数相比要相对大一些。这意味着如果在数据库中使用 uniqueidentifier 键,可能会带来两方面的消极影响:存储?#21344;?#22686;大;索引时间?#19979;?/li>

我也不是推荐GUID最好,其实在不同的情况,我们都可以采用上面的某一种方式,思考了一些利与弊,也方便大家在进行设计时参考。

本文地址:http://www.bavugt.tw/librarys/veda/detail/383,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.bavugt.tw/librarys/veda/detail/383

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效?#23454;停?#25105;觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系?#24120;?#22240;为在特定领域有一个足够量的知?#35835;?足够?#24049;?#30340;知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足?#38405;?#25324;面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《重来:更为简单有效的商业思维》 贾森?弗里德(Jason Fried) (作者), 大卫?汉森(David Heinemeier Hansson) (作者), Mike Rohde (插图作者), 李瑜偲 (译者)

这本书呈现的是一种更好、更简单的经商成功之道。读完这本书,你就会明白为什么计划?#23548;?#19978;百害而无一益,为什么你不需要外界投资人,为什么将竞争视而不见反倒会发展得更好。事实是你所需要的比你想象的少得多。你不必成为工作狂,你不必大量招兵买马,你不必把时间浪费在案头工作和会议上,你甚至不必拥有一间办公室。所有这些都仅仅是借口!

更多计算机宝库...

有极速快乐十分吗
浙江快乐彩开奖结果淑 今天新疆18选7开奖结果 云南11选5走势图手机版 欢乐斗地主单机版 jdb财神捕鱼辅助器 黑龙江p62开奖时间 腾讯欢乐麻将 3福彩计划表 app源码彩票 981棋牌旧版本