除了SQL Server之外,我还可以安全地使用哪个数据库的GUID作为主键?

除了SQL Server之外,我还可以安全地使用哪个数据库的GUID作为主键?,sql,database-design,Sql,Database Design,我希望使用Guid的原因是,如果必须将数据库拆分为多个,则两个数据库上的主键不会重叠。因此,如果我使用Guid,就不会有任何重叠。我还想在url中使用GUID,因此需要为GUID编制索引 我将使用ASP.NET C#作为我的web服务器。您将使用的大多数RDBMS都可以将任意数量和类型的列作为主键。因此,如果将GUID存储为长度为n的字符(n),应该可以。现在,我不确定这是否可取,因为我猜对字符的索引不如对整数的索引有效 希望对您有所帮助。我想您也可以将GUID存储为int128 众所周知,my

我希望使用Guid的原因是,如果必须将数据库拆分为多个,则两个数据库上的主键不会重叠。因此,如果我使用Guid,就不会有任何重叠。我还想在url中使用GUID,因此需要为GUID编制索引


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

您将使用的大多数RDBMS都可以将任意数量和类型的列作为主键。因此,如果将GUID存储为长度为n的字符(n),应该可以。现在,我不确定这是否可取,因为我猜对字符的索引不如对整数的索引有效


希望对您有所帮助。

我想您也可以将GUID存储为int128


众所周知,mySQL和postgres都支持GUID数据类型(我相信它被称为UUID,但它是一样的)。MySQL有一个很好的解决方案。Oracle有一个功能。

除非我完全失去了内存,否则正确设计的3+标准格式数据库模式不依赖唯一的INT,也不依赖扩展GUID或UUID作为主键。它也不使用ints/GUID/UUID的中间查找表来关联包含数据的表

您应该打磨您的模式,直到它根据表中的数据表示数据表之间的关系,而不是自动生成的与数据没有内在关系的标识符


我自由地承认,您可能只是在做一些真正需要guid(或自动递增整数)作为主键的事情。但我严重怀疑这种情况——几乎从来都不是这样。

正如其他人所说,您可以在几乎任何现代数据库中使用guid/uuid。生成GUID的算法非常严格,您可以合理地确定不会出现重复,但需要考虑一些因素

虽然GUID通常是128位值的表示,但实际使用的格式不同于实现到实现——您可能需要考虑通过移除非重要字符(通常是破折号或空格)来规范化它们。 +)为了绝对确保唯一性,还可以向guid追加一个值。例如,如果您担心MS和Oracle GUI发生冲突,请在前者中添加“MS”,在后者中添加“或”-现在即使GUI本身发生冲突,它们也不会发生冲突

但是,正如其他人所提到的,这里可能要付出严重的代价:您的密钥将很大(128位),并且索引不太好(尽管这在某种程度上取决于实现)

这项技术对于小型数据库(尤其是那些整个数据集都可以放在内存中的数据库)非常有效,但随着DBs的增长,您肯定必须接受性能权衡

你可以考虑的一个问题是混合方法。如果没有更多信息,就很难真正了解您想要做什么,因此这些可能没有帮助:

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

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

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

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

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


简而言之,我会说GUID是好的和简单的,做你想做的,但是你应该只考虑它们,如果数据集很小或者B)DBMS有特定的特性来优化它们作为键的使用(例如顺序GUID)。如果数据集将非常大,或者如果您试图限制DBMS特定的依赖关系,我将更多地使用优化“键+标识符”策略。

您可以根据选择设计的任何数据库模式实现自己的成员资格提供方。这远没有一开始看起来那么棘手


谷歌“滚动你自己的会员提供商”来获取大量的指针。

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


您确实失去了一些索引的好处,因为它将存储为字符串,但它应该完全向后兼容,以便您可以导入/导出到SQL Server或从SQL Server导出。

通过查看注释,您似乎正在尝试使用与MS SQL不同的数据库和ASP.net成员资格提供程序,正如其他人提到的那样您可以让自己的提供商使用不同的数据库,但是快速的谷歌搜索发现了一些现成的选项:


希望这些帮助

如果你已经使用了其他的MS技术,你应该考虑SQL Server Express。
它是MS Sql Server的真正实现,并且是免费的。正如您可能想象的那样,它确实有很大的局限性,但如果您的产品能够适应这些局限性,您将获得Sql Server的支持、开发人员社区和稳定性,如果您需要增长,还可以获得清晰的升级路径。

仅为了正确性,ASP.NET C#是一种编程语言,而不是web