Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server以外的数据库中的GUID_Sql_Nhibernate_Database Design_Orm_Auto Increment - Fatal编程技术网

SQL Server以外的数据库中的GUID

SQL Server以外的数据库中的GUID,sql,nhibernate,database-design,orm,auto-increment,Sql,Nhibernate,Database Design,Orm,Auto Increment,问题:目前我正在为我的一个项目规划数据库 我打算将ASP.NET MVC用于用户后端,数据库位于Linux和/或Windows上 现在,即使我只为windows制作,我也必须考虑到,不同的客户使用不同的数据库系统。现在,我想我可以使用nHibernate,然后我可以把所有东西都放到代码中,它可以在所有mayor数据库上工作,比如Oracle/Sybase/MS/PostGre/MySQL/Firebird 我现在的问题是GUIDs。SQLServer使用GUI,而其余的使用integer aut

问题:目前我正在为我的一个项目规划数据库

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

现在,即使我只为windows制作,我也必须考虑到,不同的客户使用不同的数据库系统。现在,我想我可以使用nHibernate,然后我可以把所有东西都放到代码中,它可以在所有mayor数据库上工作,比如Oracle/Sybase/MS/PostGre/MySQL/Firebird

我现在的问题是GUIDs。SQLServer使用GUI,而其余的使用integer auto increment作为主键。虽然自动增量在理论上更好,但它会造成保持多个数据库同步的问题,或手动更改内容的问题,这需要CSV导入/导出

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

您将如何解决此问题/您使用什么作为主键?
或者你如何回避自动增值问题,比如插入一个CSV文件而不改变AutoID…

< P>你也可以考虑生成一个主键,它是自动增量(即设置序列)和它生成的机器的唯一标识符的组合,也许使用MAC地址。 请参阅以进行讨论

这样,您就有了一个本地唯一的(由于序列)ID,它也是全局唯一的(由于MAC地址部分)

我知道,我知道,但这是否真的是你所在领域的风险,取决于你自己。此外,当您测试代码时,欺骗它的能力可能很方便


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

基本上,如果希望使用“唯一的DB实例ID”来避免“表ID”冲突,则只有两种选择:

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

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


老实说,根据你目前对问题的描述,我看不到其他选择

使用
Guid.comb
生成器键的Guid键在任何数据库中都可用,即使它没有作为本机类型的Guid。

Oracle和PostgreSQL也支持Guid,因此不需要在那里使用序列(当然,Diego是对的:如果您使用自己的算法来创建GUID,则始终可以使用自己生成的GUID存储varchar列)


请注意,它的拼写是PostgreSQL,never PostGre

我在使用Guid时从未遇到任何问题。我们在一个有许多记录(百万)的系统中使用Guid.Comb由于GUI本身的原因,我没有遇到任何问题。我的卖点是,我可以在将某些内容持久化到数据库之前生成ID。即使在客户端上也是如此。这在CQRS场景中非常有用。 我认为你唯一应该考虑的是人的可读性。很难查看数据库并在一个主/详细场景中匹配记录。


还有一个关于Firebird…Uuid的说明是以八位字节的形式编写的。我用来管理数据库的大多数客户端都不能以合适的格式表示这些客户端。因此它通常只显示为几个字符(可能只是将字节数组解码为字符串)。但我不知道其他提供程序。例如,SQLServer Management Studio可以很好地显示它们。

不要将GUID用作SQL Server中的主键/群集键-请参见此处的原因:但是…,如果auto id+GUID不是一个好主意,那会怎么样?我想您会发现GUID会比自动递增整数id造成更大的混乱(哪个SQL Server也有附带说明)。GUID如何创建混乱?我知道导入以前导出的带有autoinc.integer的CSV文件会创建一个大混乱,因为它会更改其他地方引用的所有主键…但是GUID,您如何创建混乱?我想知道如何在.NET中删除MAC地址GUID部分(我认为在SP 1中)。这不是一个好主意,因为如果用户获得GUID(发送到他的机器),他可以重建服务器MAC地址,这为各种滥用打开了大门。当然,将GUID与自动增量相结合将是一个极其愚蠢的想法,因为它将GUID和自动增量这两个系统的问题结合在一起……我对您的场景了解不够,无法提供具体的建议-这取决于应用程序的运行方式使用:如果您确定始终存在一个不同的服务器,则可以使用仲裁号(例如零)替换其MAC地址部分。您也可以在MAC地址上使用单向编码功能。如果您更详细地解释服务器/节点的关系,我可能会更具体。如果新节点注册到服务器,您可以删除MAC地址,只需分配一种“站点id”对于每个卫星数据库。我试图更好地解释这一点,检查修改后的答案。因为他使用的是NHibernate,所以在使用hilo算法进入数据库之前,也可以生成他的bigint/int ID。事实上,这还有另一个问题。如果在其他实体中有封装在列表中的实体,那么这些子实体将得到当NHibernate持久化它们时分配eir ID。对于GUID,所有实体都在对象实例化时分配ID。或者换句话说,只有在调用MakePersistent或等效对象时,才能获得ID。