2015-02-09 82 views
1

我有许多数据库,每个数据库都有一个审计表。其中一个数据库是具有诸如国家,州等表格的“通用”数据库。独特标识符在数据库中是唯一的吗?

此公共数据库的表格在其他数据库中作为视图引用。

目前我的审计表有一个标识列。对于列出审计记录,我使用UNION将普通数据库中的审计表和普通数据库中的审计表联合起来。

但是审计表中的标识列可能是相同的。

如果我在审计表中添加uniqueidentifier列并将其用作唯一标识,那么这个列在数据库中是唯一的吗?

+0

...并且它们在多元统一性方面在统计上是独一无二的?这需要多少混乱? – ericP 2017-01-05 21:44:51

回答

3

如果您使用uniqueidentifier代的内置方法(如newId()或C#的Guid.NewGuid()),是的,它将在数据库,服务器,国家等任何地方都是唯一的。

事实上,这是GUID的重要用途之一 - 复制。如果您在两个数据库中具有相同的GUID,则可以保证它是故意放在那里的。

但是,请注意,GUID确实有缺点 - 它们可能会使您的索引性能变差(或至少需要更多维护),而且它们通常较大。

此外,GUID是不是完全随机 - 有几个不同的GUID生成算法,其中有些是天生独特的(例如,使用MAC地址作为GUID的一部分 - 的MAC在默认情况下独一无二的,虽然可以手动覆盖它们) - 因此每个物理服务器的一部分是唯一的,并且该机器确保它不使用两个GUID的相同时间戳。还有顺序的GUID(newSequentialId()),这在避免索引碎片方面非常方便(当然对于聚簇索引非常有用) - 请注意那些取决于计算机的MAC地址,并且它们是可预测的,所以如果您正在制作GUID是公开的,而你依赖于他们是“秘密的”,你可能不想使用这些。一些GUID算法比其他算法更具可预测性。

+0

可能值得补充的是,你不应该使用NEWSEQUENTIALID()函数 - 这将不会达到OP的要求。 – 2015-02-09 07:47:01

+0

@RhysJones实际上,'newSequentialId'在不同机器上是唯一的,但只有当硬件可以区分它们时 - 网卡的MAC地址。服务器往往具有唯一的MAC地址。 – Luaan 2015-02-09 07:51:01

+0

@RhysJones但是,顺序的GUID有自己的问题(就像所有其他的GUID)。 – Luaan 2015-02-09 07:57:58

0

它是普遍独特的。它是一个随机生成的32个字符串,可能会有1 /(16^32)的重复。

没有一定的机制来创造独特性,极度低概率完成这一切。

+0

实际上,有几种机制可以保证唯一性 - 如果你遵循正确的算法。当然,我见过很多GUID库,它们可以完成你所说的 - 生成一个16字节的随机字符串。这是*不*真正的GUID。一个良好的完整性检查正在查看版本号 - 如果它不在那里,它可能是一个糟糕的GUID。只有版本4的标准GUID符合你的定义,尽管当然它们仍然具有适当的版本结构,所以你没有得到完整的16字节 - 当然,这6个比特并没有产生很大的差别。 – Luaan 2015-02-09 07:57:16

+0

这是一个正确的回应。当然,正如@luuan所说的,物理计算机设备中没有确切的随机性,随机性是通过计算生成的,有些使用随机生成算法,有些使用更通用的方法来生成guid,正如您所说的。但我并不是想要过度地解决这个问题。根据我的观点,只要你不会决定产生指导或不进行科学研究的最佳方式,只要承认它的独特性来自较小的概率就足够了。这就是我刚刚以这种方式回答的原因。 – user3021830 2015-02-09 08:29:29