什么是你的意见,对用付作为数据库的行标识符,特别是在网络应用程序?

StackOverflow https://stackoverflow.com/questions/5949

  •  08-06-2019
  •  | 
  •  

我总是喜欢使用长整数作为主键数据库,为简单起见,(假定的)的速度。但是当使用 休息 或轨道状URL方案为对象的情况下,我会那么结束了这样的Url:

http://example.com/user/783

然后假设的是,也有用户提Id的782,781,...,2,1.假设该网络应用程序的问题是不够安全,以防止人们进入其它数量,以查看其他用户无需授权,一个简单的顺序分配替代的关键,也"泄漏"的实例总数(超过这一),在这种情况下用户,这可能是特权的信息。(例如,我用户#726在计算器.)

将一个 Usb驱/GUID是一个更好的解决方案吗?然后我可以设立这样的Url:

http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66

不完全是简洁的、但有较少的默示信息有关的用户。当然,这意味的"安全通过默默无闻",这是无可替代的适当安全,但似乎至少多一点安全。

是利益的价值的成本和复杂性的实施应付对网址的对象的实例?我认为,我仍然想要利用整数列数据库PKs只是为加速联接。

还有问题的数据库表示的付.我知道MySQL将它们作为36-character strings.Postgres似乎有一个更有效的内部表示,(128位?) 但是我没尝试过了我自己。任何人有任何经验?


更新:对于那些询问关于使用用户名称网址(例如, http://example.com/user/yukondude),作为对象的情况有名字是独特的,但对于无数的网络应用程序的对象真的可以仅能识别号码吗?订单、交易、发票、重复的图像的名字,计算器问题...

有帮助吗?

解决方案

我不能说有关网侧的问题。但付大n层的应用。PK代可以分散:每个客户产生它自己的pk没有碰撞风险。和速度的差异一般很小。

确保你的数据库支持一个高效率的存储数据类型(16字节,128位)。至少你可以编码的usb驱串在base64和使用char(22).

我已经用它们广泛地与火鸟和做出的建议。

其他提示

为什么它值得,我看见一个长期运行存储的过程(9秒)下降到仅有几百毫秒的运行时间仅仅通过交换从GUID主键整数。这并不是说 显示 GUID是一个糟糕的想法,但正如其他人已经指出的那样,加入它们,并编制索引,按定义,是不会在任何地方接近尽快与整数。

我可以回答你,在SQL server如果使用唯一标识符(GUID)数据类型和使用的NEWID()功能创造价值,你会得到可怕的碎片,因为页的分裂。其原因是,当使用NEWID()价值产生的不是连续的。SQL2005年加入的NEWSEQUANTIAL()功能的补救办法,

一种方法仍然使用GUID和int是有一个guid和一个int在一个表格,以便guid地图的诠释。guid是外部使用,但int在内部数据库

例如

457180FB-C2EA-48DF-8BEF-458573DA1C10    1
9A70FF3C-B7DA-4593-93AE-4A8945943C8A    2

1和2将被用于联接和guid在网应用程序。这表将是非常狭窄,应该很快的查询

为什么夫妻你的主键你URI?

为什么没有你的URI关键是人类可读(或难以猜测的,这取决于你的需求),和你的初级指数整数的基础,这样你得到最好的两个世界。很多的博客软件的确是,那里的暴露id的项确定的'子弹',与数字标识是隐藏在内部的系统。

增加的好处是,现在你有一个很好的网址结构,这是良好的搜索引擎优化。显然对于一个交易,这不是一件好事,但是对于像计算器,这是重要的(见URL顶上...).得到独特性不是那么困难。如果你真的关注,储存的哈希塞内部表格的某处,并查找以前插入。

编辑: 计算器并不完全使用该系统中,我描述,请参阅人的评论如下。

而不是这样的Url:

http://example.com/user/783

为什么不具有:

http://example.com/user/yukondude

这是友好的人和不泄漏点的信息?

你可以使用一个整数,这是关系到行的数量,但不是连续的。例如,可以采取的32位的顺序ID并重新安排他们有固定的方案(例如,比1变为比6,2位变位15,etc..).
这将是一个双向的加密,你将确保两个不同的Id总是会有不同的加密。
它将明显地可以容易解,如果一个需要时间产生足够的标识和获取模式,但是,如果我理解正确的话你的问题,你只要不是得到的信息太容易了。

我们使用Guid作为主要钥匙,为我们所有的表,因为它兼作Guid为MS SQL服务器复制。使得它很容易在客户突然打开了一个办事处在另一个世界的一部分...

我不认为GUID给你很多好处。用户恨长,难以理解的网址。

创建一个更短的ID,你可以地图网址,或强制执行的一个独特的用户名称《公约》(http://example.com/user/brianly).这些家伙在 37Signals 可能会嘲笑你为担心这样的事情,当它涉及到一个网络应用程序。

顺便说一句,你可以强制你的数据库开始创建整数Id从一个基本价值。

它还取决于什么是你关心你的应用程序。为n层的应用程序Guid/应付更简单的执行和更易于港口之间不同的数据库。产生整数键的一些数据库支持的顺序对象本身和一些需要定制建设的顺序表。

整键可能是(我没有数字)提供一个优点进行查询和索引编制的性能,以及空间的使用情况。直接DB查询也更容易使用的数字的钥匙,小复制、粘贴的,因为他们更容易记得.

我的工作与学生管理系统,该系统使用usb驱的形式的一整数。他们有一个表举行下一次独特的标识。

虽然这可能是一个好主意对于建筑的角度看,它使工作与在一个日常的基础上的困难。有时需要做大容量插入并具有痕,使这个非常困难的,通常需要编写标,而不是一个简单的选择进入的发言。

我已经试过的实际网络应用程序。

我的意见是,最好使用整数和简短、易于理解的网址。

作为一个开发商,它感到有点可怕看到的顺序整数,以及知道一些信息录总计数中漏出,但说实话-大多数人可能不关心,该信息已从来没有真正的关键要我的企业。

具有长丑usb驱网址似乎我更关闭正常用户。

我认为,这是一个对这些问题,导致类似宗教的辩论,并且其几乎徒劳无益的谈论。我只是说用什么你喜欢。在99%的系统,它将无论哪种类型的钥的使用,这样的好处(中指出的其他员额)采用一种在其他将永远是一个问题。

我认为使用一个GUID会是更好的选择在你的情况。它需要更多的空间,但是更加安全。

Youtube使用的11个文字与base64编码所提供的11^64可能性,他们通常是很容易管理来编写。我不知道,如果这将提供更好的性能比一个完整的usb驱.Usb驱转换为基64将是双重的大小,我相信。

更多的信息可以在这里找到: https://www.youtube.com/watch?v=gocwRvLhDf8

只要你使用数据库系统与有效的储存、硬盘驱动器是廉价的这些天无论如何...

我知道GUID的可b*替换工作有某些时候和某些查询的开销,但是从安全的角度来看,他们是救世主。

想安全通过默默无闻,他们适合当形成模糊URI和建筑标准化DB的表中,记录和列定义的安全你不能去错了GUID是,试图这样做,与整数的基础id's.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top