1

我的情况是,我们发布了一个新版本的软件,它将使用与旧版本不同的数据库(架构中的重大变化)。新旧系统都将投入生产将有相当长的一段时间,我们需要确保在两个数据库之间生成唯一 ID(我们不希望数据库 A 中有一行具有与数据库 B) 中的行相同的 ID。数据库是 Sybase。

我想出的可能的解决方案:

  1. 使用支持非常大的数字的数据类型并为每个数字分配一个范围,希望它们永远不会溢出。
  2. 对一个数据库使用负值,对另一个数据库使用正值。
  3. 添加一个标识数据库的附加列,并使用该列和当前 ID 的组合作为键。
  4. 哭。

我还能做什么?是否有更优雅的解决方案,以某种方式让两个数据库协同工作?我相信这两个数据库将在同一台服务器上,如果这很重要的话。

4

7 回答 7

6

在这种情况下,GUID 或全局唯一 ID 可以是方便的主键。我相信 Sybase 支持他们。

编辑:尽管如果您的整个数据库已经基于整数主键,那么切换到 GUID 可能不是很实用 - 在这种情况下,只需对数据库之间的整数空间进行分区,正如 GWLlosa 和其他人所建议的那样。

于 2009-05-01T14:37:03.000 回答
5

我已经看到这种情况发生了几次。在我参与的那些上,我们只是为旧的分配了足够大的 ID 空间(因为它已经运行了一段时间,并且我们知道它使用了多少键,我们可以计算它还有多少键'd need for a specified 'lifespan') and start the "ID SEQUENCE" of the new database above that.

我建议不要使用任何其他技巧,因为它们都需要更改“旧版”应用程序,这是我认为没有必要承担的风险。

于 2009-05-01T14:38:19.207 回答
3

在您的情况下,我会考虑使用唯一标识符(GUID)作为数据类型。当您使用系统函数newid()创建它们时,它们被认为是唯一的。

CREATE TABLE customer (
   cust_key UNIQUEIDENTIFIER NOT NULL
            DEFAULT NEWID( ),
   rep_key VARCHAR(5),
   PRIMARY KEY(cust_key))
于 2009-05-01T14:39:25.320 回答
2

使用 # 预播新数据库,该 # 大于合并之前旧数据库将达到的值。

我过去曾这样做过,并且记录量相当低,因此我以 200,000 作为初始记录数开始了我的新数据库。然后到时候,我只是将所有旧记录迁移到新系统中。

完美解决!

于 2009-05-01T14:37:11.253 回答
2

GUID 专为这种情况而设计。

于 2009-05-01T14:37:11.940 回答
2

如果您将在每个数据库上创建相似数量的新项目,您可以在一个数据库上尝试偶数 id,在另一个数据库上尝试奇数 id

于 2009-05-01T14:39:50.747 回答
1

使用 UNIQUEIDENTIFIER 数据类型。我知道它可以在 MS SQL Server 中工作,据我在谷歌搜索中看到的,Sybase 支持它。

http://www.ianywhere.com/developer/product_manuals/sqlanywhere/0902/en/html/dbrfen9/00000099.htm

于 2009-05-01T14:39:33.243 回答