2012-05-07 7 views
4

SQL Serverデータベースから情報を取り出し、Webサービスを介してオブジェクトモデルをロードし、次に渡すアプリケーションを作成しようとしています。その情報をSQL Serverデータベースとは異なるスキーマに基づいたAccess DBに格納しますが、含まれる情報は同じです(したがって、これはETLプロセスに似ていると想定しています)。私が実行している問題は、情報(SQL Server)を引き出しているデータベースのプライマリキーがGUIDであるのに対し、私がそれらを(アクセス)に入れているデータベースはINTだということです。だから、例えば:GUIDを持つデータベースのキーと整数を持つデータベースのキーとの間のデータベース関係を維持する

表1、SQL Server内の人表:

╔══════════════════════════════════════╦══════════╦════════════╗ 
║     ID     ║ Name ║ CreatedOn ║ 
╠══════════════════════════════════════╬══════════╬════════════╣ 
║ 3648F6BB-F743-4952-9C69-93336667F3B1 ║ Person 1 ║ 01/01/2012 ║ 
║ DE44577A-CAE7-4101-B962-C052214E723B ║ Person 2 ║ 02/01/2012 ║ 
║ 94115C5E-9C7E-40CF-8A87-D4D837BD5DB3 ║ Person 3 ║ 03/01/2012 ║ 
║ F93E77D9-C344-420C-9499-BA3B4DD0F0BA ║ Person 4 ║ 04/01/2012 ║ 
╚══════════════════════════════════════╩══════════╩════════════╝ 

は表2、Accessの人表:

╔════╦══════════╦════════════╗ 
║ ID ║ Name ║ CreatedOn ║ 
╠════╬══════════╬════════════╣ 
║ 1 ║ Person 1 ║ 01/01/2012 ║ 
║ 2 ║ Person 2 ║ 02/01/2012 ║ 
║ 3 ║ Person 3 ║ 03/01/2012 ║ 
║ 4 ║ Person 4 ║ 04/01/2012 ║ 
╚════╩══════════╩════════════╝ 

ので、表1は、データの中に返される方法ですSQL Serverデータベース、および表2は、情報をAccessデータベースに表示する方法を示しています。したがって、すべてのGUIDは整数である必要がありますが、データ間の関係は同じに維持する必要があります。たとえば、SQL ServerとAccessで人のアドレス(アドレステーブルも同様に設定されます)を取得するためにクエリを実行すると、クエリはGUIDまたは整数が使用されているかどうかにかかわらず同じ結果を返さなければなりません。

私は何を考えていたこと(データベースに日付時刻型であり、そのようなものとして、すべてのレコードで一意である必要があります)CreatedOn日までに注文した、SQL ServerでROW_NUMBER()を使用していた:

SELECT 
    (ROW_NUMBER() OVER (ORDER BY CreatedOn)) AS ID, 
    Name, 
    CreatedOn 
FROM Table2; 

唯一のことは、クエリから重複した整数IDが返されてきていることです。たとえば、上記の表1は次のようになります。

╔════╦══════════╦════════════╗ 
║ ID ║ Name ║ CreatedOn ║ 
╠════╬══════════╬════════════╣ 
║ 1 ║ Person 1 ║ 01/01/2012 ║ 
║ 2 ║ Person 2 ║ 02/01/2012 ║ 
║ 1 ║ Person 3 ║ 03/01/2012 ║ 
║ 1 ║ Person 4 ║ 04/01/2012 ║ 
╚════╩══════════╩════════════╝ 

各IDは一意である必要があります。誰かが私が達成しようとしていることをやり遂げる良い方法を考えることができますか?私は現在それをやろうとしている方法に何か問題はありますか?

ご協力いただければ幸いです。

答えて

0

最も簡単な解決策は、片方または両方のスキーマを同じに変更することです。 AccessとSQLの両方でレコードを追加する場合は、GUIDを使用して2つの異なるレコードに対して同じIDが追加されないようにします。そして、あなた自身がしていることは、あなた自身の「複製」システムを動かすことです。 AccessとSQLの両方がGUIDをサポートしています。

テーブルごとに何らかのルックアップが必要になると思われません。これにより、各GUIDに対応する整数が返されます。逆も同様です。 Accessテーブル(表2)に追加の列としてGUIDを追加すると、ルックアップテーブルとして使用できます。

ROW_NUMBER()は一意の番号を返しますが、使用するたびに1から始まり、各テーブルのすべての挿入を1つのセットで行う必要があります。アクセス時にオートナンバー型フィールドを使用すると、別々のインサートで一意の値が得られます。

アクセステーブルにSQLのGUIDと一意のIDがあることを前提とすると、アドレステーブルなどの外部キーを持つテーブルに挿入するたびにルックアップを行うだけで済みます。したがって、GUIDを使用してSQLからアドレスを挿入して、GUIDに人の参加アクセスのPersonテーブルを識別し、Personの整数IDを挿入します。

1

あなたはおそらく順序は常に同じであることを確認することはできませんので、私はあなたがあった場合、私はROW_NUMBER()に依存しないでしょう。

まず、あなたの例では、あなたは(時間なし)のみ日付の値を示し、 CreatedOn列の場合。同じ日に複数の人物が作成された場合、その日までに発注した人が最初に来る人物を確認することはできません。
CreatedOnの列に実際に時間があっても、その人がテーブルから削除された場合、その後の人物のROW_NUMBERが変更されます。


最も簡単な解決策は、すでにhis answerにwebturnerによって提案されたように、テーブルの1つを変更することであろう。
何らかの理由でこれを行うことができない場合(たとえば、いずれかのデータベースのスキーマを変更できない場合や、テーブルのスキーマを変更した場合に従来のものが壊れた場合など)は、あなたは2つのテーブル間の関係を格納するマッピングテーブル:あなたは既存のものを変更することが許可されていない場合

╔══════════════════════════════════════╦══════════╗ 
║    SqlServerID    ║ AccessID ║ 
╠══════════════════════════════════════╬══════════╣ 
║ 3648F6BB-F743-4952-9C69-93336667F3B1 ║ 1  ║ 
║ DE44577A-CAE7-4101-B962-C052214E723B ║ 2  ║ 
║ 94115C5E-9C7E-40CF-8A87-D4D837BD5DB3 ║ 3  ║ 
║ F93E77D9-C344-420C-9499-BA3B4DD0F0BA ║ 4  ║ 
╚══════════════════════════════════════╩══════════╝ 

あなたも、第3のデータベースにそれを置くことができます。

関連する問題