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

时间:2009-09-02 22:46:07

标签: sql database-design

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

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

9 个答案:

答案 0 :(得分:12)

Postgres有一个UUID type。 MySQL有一个UUID function。 Oracle具有SYS_GUID功能。

答案 1 :(得分:5)

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

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

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

正如其他人所提到的那样,这里可能需要付出巨大的代价:你的密钥会很大(128位)而且索引不会很好(尽管这在某种程度上取决于实现)。

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

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

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

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

索引这样的值(因为值仍然是连续的)应该快得多。

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

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

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

答案 2 :(得分:3)

您将使用的大多数RDBMS都可以将任何数量和类型的列作为PK。因此,如果您将GUID存储为长度为n的CHAR(n),那么您应该没问题。现在,我不确定这是否可取,因为我猜测CHARs上的索引效率不如整数那样有效。

希望有所帮助。

答案 3 :(得分:1)

我想你也可以将GUID存储为int128。

已知mySQL和postgres都支持GUID数据类型(我相信它叫做UUID,但它也是一样的。)

答案 4 :(得分:0)

除非我完全丢失了内存,否则正确设计的3rd +普通表单数据库模式不依赖于唯一的int,也不依赖于主键的扩展GUID或UUID。它也不使用ints / GUIDS / UUIDS的中间查找表来关联包含数据的表。

你应该研究你的模式,直到它根据表中的数据表达数据表之间的关系,而不是与数据没有内在关系的自动生成的标识符。

我自由地承认你可能正在做一些真正需要主键的GUID(或自动递增整数)的东西。但我严重怀疑是这样的 - 它几乎从来都不是。

答案 5 :(得分:0)

您可以根据您选择设计的数据库架构实现自己的成员资格提供程序。它远不如它最初看起来那么棘手。

google“滚动你自己的会员提供商”以获得大量指示。

答案 6 :(得分:0)

在我的理论小世界里,你可以用SQLite做到这一点。您将从.Net生成Guid并将其作为字符串写入SQLite数据库。您也可以索引该字段。

您确实失去了一些索引优势,因为它会被存储为字符串,但它应该完全向后兼容,以便您可以导入/导出到SQL Server。

答案 7 :(得分:0)

通过浏览评论看起来您正在尝试使用不同的数据库与ASP.net会员提供商进行MS SQL - 正如其他人提到的那样,您可以推动自己的提供商使用其他数据库但是快速Google搜索找到了一些现成的选择:

MySQL Provider

MySQL Provider 2

SqlLite Provider

希望这些帮助

答案 8 :(得分:0)

如果您正在使用其他MS技术,则应考虑使用Sql Server Express。 http://www.microsoft.com/express/sql/default.aspx 它是MS Sql Server的真正实现,它是免费的。它确实存在很大的局限性,但是如果你的产品能够适应那些你得到支持,开发者社区和Sql Server的稳定性以及如果你需要增长的明确升级路径。