簡體   English   中英

使用Guids維護數據庫中的鍵與使用整數的另一個鍵之間的數據庫關系

[英]Maintain Database Relationships Between Keys in a Database with Guids and Another One with Integers

我正在嘗試編寫一個應用程序,它將從SQL Server數據庫中獲取信息,通過Web服務加載對象模型,然后將該信息傳遞到Access數據庫,該數據庫基於與SQL Server不同的模式數據庫,但包含的信息是相同的(所以我假設這將類似於ETL過程)。 我遇到的問題是我正在提取信息的數據庫中的主鍵(SQL Server)是GUID,而我將它們放入(Access)的數據庫是INT。 例如:

表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,訪問中的人員表:

╔════╦══════════╦════════════╗
║ 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或整數,查詢都應返回相同的結果。

我在想的是在SQL Server中使用ROW_NUMBER(),按CreatedOn日期排序(這是數據庫中的日期時間類型,因此,在所有記錄中應該是唯一的):

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應該是唯一的。 誰能想到一個好的方法去做我想要完成的事情? 我目前正在嘗試這樣做的方式有什么問題嗎?

任何幫助將不勝感激。

如果我是你,我不會依賴ROW_NUMBER() ,因為你可能不能確定訂單總是一樣的:

首先,在您的示例中,您只顯示CreatedOn列的日期值(沒有時間)。 如果在同一天創建了多個人,如果您按該日期訂購,則無法確定哪個人首先出現。
即使您實際上在CreatedOn列中也有時間 - 如果從表中刪除了某個人,則所有后續人員的ROW_NUMBER都將更改。


最簡單的解決方案是改變其中一個表,就像webturner在他的回答中已經建議的那樣。
如果由於任何原因無法執行此操作(例如,如果您根本不允許更改任一數據庫的模式,或者如果更改了表的模式,舊的東西會中斷),則可以創建映射用於存儲兩個表之間關系的表:

╔══════════════════════════════════════╦══════════╗
║             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     ║
╚══════════════════════════════════════╩══════════╝

如果不允許更改現有數據庫,您甚至可以將其放入第三個數據庫。

最簡單的解決方案是在一端或另一端更改架構,使它們相同。 如果要在Access和SQL兩端添加記錄,那么我將使用GUID來防止為兩個不同的記錄添加相同的ID。 然后,您所做的就是滾動自己的“復制”系統。 Access和SQL都支持GUID。

如果你沒有要求對每個表進行某種查找。 這將為每個GUID提供Integer等效項,反之亦然。 如果將GUID作為附加列添加到Access表(表2)中,則可以將其用作查找表。

ROW_NUMBER()將返回唯一的數字,但每次使用時將從1開始,因此每個表的所有插入都需要在一個集合中完成。 如果在訪問中使用自動編號字段,則會在不同的插入中為您提供唯一值。

鑒於您現在在Access表中擁有SQL的GUID和唯一ID,只需在每次插入帶有外鍵的表(例如地址表)時進行查找。 因此,當您使用GUID從SQL插入地址時,可以在GUID上標識加入訪問的Person表,並插入Person的整數ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM