除了SQL Server之外,哪个数据库可以安全地将GUID用作主键?

use*_*433 3 sql database-design

我想使用Guid的原因是因为如果我必须将数据库分成两部分,我将不会在两个数据库上重叠主键.因此,如果我使用Guid,则不会有任何重叠.我也想在URL中使用GUID,因此Guid需要被索引.

我将使用ASP.NET C#作为我的Web服务器.

Mar*_*wis 12

Postgres有一个UUID类型.MySQL具有UUID功能.Oracle有一个SYS_GUID函数.


小智 5

正如其他人所说,您可以在几乎任何现代数据库中使用GUID/UUID.生成GUID的算法非常简单,你可以合理地确定你不会得到欺骗,但是有一些考虑因素.

+)虽然GUID通常是128位值的表示,但实际使用的格式不同于实现和实现 - 您可能需要考虑通过删除非重要字符(通常是短划线或空格)来对它们进行标准化.

+)为了绝对确保唯一性,您还可以向guid附加值.例如,如果你担心MS和Oracle guid碰撞会将"MS"添加到前者并将"Or"添加到后者 - 现在即使guid本身发生冲突,它们的键也不会.

正如其他人所提到的那样,这里有一个潜在的严重代价:你的密钥将很大(128位)并且不会很好地索引(尽管这在某种程度上取决于实现).

技术可以很好地适用于小型数据库(特别是那些整个数据集可以适应内存的数据库),但随着数据库的增长,您肯定必须接受性能权衡.

您可以考虑的一件事是混合方法.没有更多的信息,很难真正知道你想要做什么,所以这些可能没有帮助:

1)请记住,主键不必是单个列 - 您可以使用简单的数字键来标识行,使用另一行(包含单个值)来标识承载数据或创建密钥的数据库.将主键创建为两列的聚合允许索引编制索引较少的复杂值,并且应该明显更快.

2)您可以通过将密钥构造为连接字段来"伪造它"(如上面的想法,将DB标识符附加到密钥).因此,您的密钥将是一个简单的数字,后跟一些数据库标识符(可能是每个数据库的guid).

索引这样的值(因为值仍然是顺序的)应该快得多.

在这两种情况下,如果您拆分数据库,您将需要做一些手动工作 - 您必须使用新的数据库ID更新某些密钥,但这将是一次性的,不常见的事件.作为交换,您可以更好地调整您的数据库.

绝对有其他方法可以确保跨多个数据库的数据完整性.许多企业DBMS都内置了用于跨多个服务器或数据库集群数据的工具,有些具有特殊工具或设计模式,使其更容易,等等.

简而言之,我会说guid很简单并且做你想做的事情,但你应该只考虑它们a)数据集很小或b)DBMS有特定的功能来优化它们作为键的使用(例如顺序的GUID).如果数据集将非常大,或者如果您试图限制DBMS特定的依赖关系,那么我将通过优化"密钥+标识符"策略来实现更多目标.