2009-05-01 9 views
1

新しいソフトウェアがリリースされているので、旧式のデータベースとは別のデータベース(スキーマの大きな変更点)を使用する予定です。新しいシステムと古いシステムの両方が稼働するかなりの時間があり、2つのデータベース間に一意のIDが生成されるようにする必要があります(データベースAに行を入れたくないデータベースBの行と同じIDを持つ)。データベースはSybaseです。私が作ってみた複数のデータベース間でキーの重複を防止する

考えられる解決策:

  1. 彼らは決してオーバーフローを期待して、非常に大きな数字をサポートしており、それぞれの範囲を割り当てるデータ型を使用します。
  2. 1つのデータベースに負の値を使用し、もう一方の値に正の値を使用します。
  3. データベースを識別する追加の列を追加し、そのIDと現在のIDの組み合わせをキーとして使用します。
  4. Cry。

他に何ができますか? 2つのデータベースが一緒に機能するように、より洗練されたソリューションがありますか?私は2つのデータベースが同じサーバー上にあると信じています。

+0

古い、新、および/または両方のデータベースのPKを変更しますか? PKの問題に関係するテーブルの数はいくつですか? PKは、異なるDB内の異なるデータ型にすることも、同じでなければなりませんか? GUIDの使用をお勧めしますが、これを達成するために両方のDBを大幅に変更する必要がある場合は、本当に最適なアプローチですか? –

答えて

5

私はこれが数回起こるのを見ました。私が関与していたものについては、古いもののための十分な大きさのIDスペースを割り当てただけです(それはしばらく稼働していたので、使用されたキーの数はわかっていました指定された '寿命'を必要とする)、それを上回る新しいデータベースの "ID SEQUENCE"を開始しました。

「レガシー」アプリに変更が必要な場合にのみ、他の方法との併用をお勧めします。これは、必要性が見えないリスクです。

6

この種のケースでは、GUIDまたはグローバルに一意のIDを使用することができます。私はSybaseがそれらをサポートしていると思います。

編集:データベース全体がすでに整数の主キーに基づいている場合、GUIDに切り替えることはあまり実用的ではないかもしれません。その場合は、GWLlosaなどが提案したようにデータベース間の整数スペースを分割します。

2

以前のデータベースがマージする前に到達するよりも大きい#で新しいデータベースを事前にシードします。

私は過去にこれを行いましたが、レコードの量はかなり少なかったので、私は最初のレコード番号として200,000で新しいデータベースを開始しました。その時が来たとき、古いレコードをすべて新しいシステムに移行したばかりです。

完璧に取り組んだ!

2

GUIDはこのような状況に対応するように設計されています。

3

あなたの場合は、データ型としてuniqueidentifier(GUID)を使用することを検討します。彼らはsystem function newid()を使用して作成するときに一意とみなされます。

CREATE TABLE customer (
    cust_key UNIQUEIDENTIFIER NOT NULL 
      DEFAULT NEWID(), 
    rep_key VARCHAR(5), 
    PRIMARY KEY(cust_key)) 
2

各データベースに新しい項目の類似の数を作成する場合は、1つのデータベース、奇数IDS他ででもIDSを試すことができます。

関連する問題