SQL Server以外的数据库中的GUID

时间:2010-08-13 07:17:14

标签: sql nhibernate database-design orm auto-increment

问题:我正在为我的某个程序计划数据库。

我打算将ASP.NET MVC用于用户后端,数据库位于Linux和/或Windows上。

现在,即使我只为Windows制作它,我也必须考虑到,不同的客户使用不同的数据库系统。现在,我想我使用了nHibernate,然后我可以将所有内容都放在代码中,它适用于所有市长数据库,例如Oracle / Sybase / MS / PostGre / MySQL / Firebird。

我的探测器现在是GUID。 SQL Server使用GUID,而其余的使用整数自动增量作为主键。虽然理论上自动增量更好,但它会造成多个数据库同步或者手动更改问题的问题,这需要CSV导入/导出......

现在,由于autoid在实践中存在固有问题,我更喜欢GUID系统。由于guid是一个36个字符的字符串,我可以使用varchar(36)作为主键,但varchar作为GUID,可能不是一个理想的解决方案......

您如何解决此问题/您使用什么作为主键? 或者你如何规避自动增量问题,比如插入一个csv文件而不改变autoid ...

4 个答案:

答案 0 :(得分:2)

使用guid.comb生成器密钥的Guid密钥可用于任何数据库,即使它没有Guid作为本机类型。

答案 1 :(得分:0)

您还可以考虑生成一个主键,它是自动增量(即设置序列)和生成它的机器的唯一标识符的组合,可能使用MAC地址。

请参阅this进行讨论。

这样你就拥有了一个本地唯一的(由于序列)ID,这个ID也是全局唯一的(感谢MAC地址部分)。

我知道,我知道,you can spoof a MAC address但是您可以自行决定这是否真的存在您的域名风险。此外,当您测试代码时,欺骗它的能力可能很方便。


请更好地解释新客户数据库诞生时会发生什么。它会在服务器上注册吗?如果是,您可以在服务器上分配DB-id,并使用它代替MAC地址,只需为每个新DB分配一个编号,并将其与序列一起使用。

基本上,如果您想要“唯一数据库实例ID”来避免“表ID”冲突,那么您只有两个选择:

1)每当添加新数据库时,服务器都会分配数据库ID

2)客户端自动生成唯一ID,这通常需要使用MAC地址,“原始”或以某种方式处理。

老实说,鉴于您目前对问题的描述,我看不到其他选择。

答案 2 :(得分:0)

Oracle和PostgreSQL也支持GUID,没有必要在那里使用序列(当然迭戈是对的:如果你使用自己的算法来创建GUID,你总是可以存储使用你自己生成的GUID的varchar列)

请注意,它拼写为PostgreSQL,而不是PostGre

答案 3 :(得分:0)

我使用Guids时从未遇到任何麻烦。我们在拥有许多记录(数百万)的系统中使用了Guid.Comb,并且由于Guids本身而没有任何问题。对我而言,卖点是我可以在将数据库持久存储到数据库之前生成ID。即使在客户端。这在CQRS场景中非常有用。 我认为你唯一应该考虑的是人的可读性。很难看到数据库并匹配记录中的主/详细情景。

关于Firebird的说明...... Uuid写成八位字节。我用来管理数据库的大多数客户端都不能以合适的格式表示那些客户端。所以它通常只显示为几个字符(可能只是将字节数组解码为字符串)。我不知道其他提供商。例如,SQLServer Management Studio就可以很好地显示它们。