转贴新思路: Guid 和 Int 作为系统编号的取舍

playyuer 2004-12-01 01:25:05
蝈蝈尊(四声).net
http://blog.joycode.com/ghj/archive/2004/11/29/39911.aspx

Guid 和 Int 作为系统编号的取舍
最近一直在做下一代CSDN社区的设计,在帖子编号到底采用Guid,还是自增Int选择的时候,花费了不少心思。

最后的确定的方案是采用Guid。

原因如下:

Guid 虽然在搜索、索引寻找的时候,速度肯定比不上Int型字段。

但是,如果帖子编号采用Guid,在提交到中间层之前,就可以知道要增加的这个帖子编号是那个。

而如果使用自增Int,如果中间层的应用逻辑需要在增加到数据库之前执行,那么我要做多少费时的操作才可以知道要新增的这个帖子编号是多少。如果这个中间过程比较费时,完了,肯定超时。

在大数据量下,使用Guid的上述好处体现的非常明显。
使用Guid,中间层可以引入队列的概念,表现层只要简单的向中间层待处理队列中增加一条,既可以返回了。而不用等中间层和数据库层处理完毕。

微软的BizTalk 中表示编号的是Guid,而不是Int,这就是其中一个原因。同时很多大型系统,也是使用的Guid而不是Int。 当然,你也可以使用一套自己的编号方式。不过Guid和Int是最简单的而已。

Guid 类型字段跟Int类型字段速度对比数据,可以参看以下Blog:

http://www.cnblogs.com/zhenyulu/archive/2004/07/20/25816.html

playyuer feedback:

guid (帖子编号)可以在前端(Web/App Server 不是 DB Server)先生成,相当于预知了ID (不错)!

to SpiderMan:
"生成guid的过程可以放在数据库端" 该讨论岂不没意义了?

为了 Order By 是不是还要最好加上一个 Auto ID?????

# re: Guid 和 Int 作为系统编号的取舍 12/1/2004 1:04 PM playyuer
re: msdn上面说的,还是有可能会重复对嘛?

在同一台(中间件)机器(Web Server OR App Server 不是 DB Server)上生成 GUID ,应该肯定永远不会重复!

# re: Guid 和 Int 作为系统编号的取舍 12/1/2004 1:24 PM playyuer
如果理想状态下 GUID 真的可以保证在所有星球,所有计算机,所有数据库,所有表之间都不会出现重复!?!?!?!
就可以在"最终"客户端生成,预知 ID ! (太理想了)

本题没必要这样(不是在"最终"客户端),所以 smartphone/pocket pc 不支持GUID的生成也无所谓!
...全文
221 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzcwhq 2004-12-01
  • 打赏
  • 举报
回复
Mark
good2speed 2004-12-01
  • 打赏
  • 举报
回复
取舍要看需求来定,各有所长
lyzzbbgo 2004-12-01
  • 打赏
  • 举报
回复
Mark
playyuer 2004-12-01
  • 打赏
  • 举报
回复
GUID 生成不是很方便吗?
至于 .Net/DCOM 无所谓!
本文亮点就是不在 DataBase 生成 PK ID,而预知 PK ID!
老本 2004-12-01
  • 打赏
  • 举报
回复
作一个专门的DCOM,用来产生编号,用户请求新建帖子的时候就返回给它不就得了?
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在计算机科学领域,编译原理是研究如何将编程语言转化为机器可执行代码的理论基础。其中,三地址代码(Three-Address Code,TAC)作为一种中间表示形式,在编译器设计中经常被使用,尤其是在生成目标代码的阶段。本文将深入探讨三地址代码的概念、生成器的工作原理及其在编译过程中的作用。 三地址代码是一种简单的低级抽象语法树(AST)表示,每条指令涉及三个操作数,通常包括两个源操作数和一个目的操作数。这种格式简化了代码优化和目标代码生成的复杂性。例如,一个简单的算术表达式“x = y + z”在三地址代码中可能表示为: 在这个例子中,“t1”是一个临时变量,存储了“y + z”的结果,然后这个结果被赋值给“x”。 生成三地址代码的过程通常发生在编译器的中间阶段,即语法分析之后,语义分析之前。这个阶段称为“代码生成”或“中间代码生成”。编译器通过词法分析器处理源代码,将其转化为标记流;接着,语法分析器根据上下文无关文法将标记流解析成抽象语法树。三地址代码生成器就是在这个阶段介入,它遍历AST,为每个节点生成对应的三地址指令。 在Turbo C3.0这样的编译器环境下,开发者可以实现自己的三地址代码生成器。虽然Turbo C3.0是一款较老的编译器,但其C语言编译器设计原理依然适用于现代编译器开发。开发过程中,我们需要考虑如下关键点: 符号表管理:符号表记录了程序中所有标识符的类型、作用域和关联地址,对于生成三地址代码至关重要,因为它提供了关于操作数的类型信息。 数据类型转换:编译器必须处理不同数据类型的运算,确保它们在三地址代码中正确表示。例如,整型与浮点型之间的转换需要特别处理。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧