首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >维护带有Guids的数据库中的键和具有整数的数据库中的键之间的数据库关系

维护带有Guids的数据库中的键和具有整数的数据库中的键之间的数据库关系
EN

Stack Overflow用户
提问于 2012-05-07 22:42:50
回答 2查看 156关注 0票数 4

我正在尝试编写一个应用程序,该应用程序将从SQL Server数据库中提取信息,通过ETL服务加载对象模型,然后将该信息传递到Access DB中,该数据库基于与SQL Server数据库不同的架构,但其中包含的信息是相同的(因此,我假设这类似于ETL过程)。我遇到的问题是,我提取信息的数据库(SQL Server)中的主键是GUID,而我将它们放入的数据库(Access)是INTs。举个例子:

表1,SQL Server中的Person表:

代码语言:javascript
运行
复制
╔══════════════════════════════════════╦══════════╦════════════╗
║                  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中的人员表:

代码语言:javascript
运行
复制
╔════╦══════════╦════════════╗
║ 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日期排序(这是数据库中的日期时间类型,因此在所有记录中都应该是唯一的):

代码语言:javascript
运行
复制
SELECT 
  (ROW_NUMBER() OVER (ORDER BY CreatedOn)) AS ID,
  Name,
  CreatedOn
FROM Table2;

唯一的问题是,我看到查询返回了重复的整数ID。因此,例如上面的表1将如下所示:

代码语言:javascript
运行
复制
╔════╦══════════╦════════════╗
║ 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应该是唯一的。有没有人能想出一个好方法来做我想要完成的事情?我现在尝试的方式有什么问题吗?

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2012-05-17 22:43:29

如果我是您,我不会依赖ROW_NUMBER(),因为您可能不能确保顺序总是相同的:

首先,在您的示例中,您只显示了CreatedOn列的日期值(没有时间)。如果在同一天创建了多个人,如果您在该日期之前订购,您不能确定哪个人先来。

即使您实际上在CreatedOn列中也有一个时间-如果从表中删除一个person,则所有后续person的ROW_NUMBER都将更改。

最简单的解决方案是更改其中一张表,就像webturner在his answer中已经建议的那样。

如果出于任何原因不能这样做(例如,如果根本不允许更改任何一个数据库的模式,或者如果更改了表的模式,遗留内容将中断),则可以创建一个映射表,在其中存储两个表之间的关系:

代码语言:javascript
运行
复制
╔══════════════════════════════════════╦══════════╗
║             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     ║
╚══════════════════════════════════════╩══════════╝

如果不允许更改现有的数据库,您甚至可以将其放入第三个数据库。

票数 1
EN

Stack Overflow用户

发布于 2012-05-17 18:22:58

最简单的解决方案是在一端或另一端更改模式,使它们相同。如果您同时在Access和SQL结束时添加记录,那么我将使用GUID来防止为两个不同的记录添加相同的ID。然后你所要做的就是滚动你自己的“复制”系统。Access和SQL都支持GUID。

如果失败,您将需要对每个表进行某种类型的查找。这将为每个GUID提供Integer等效项,反之亦然。如果将GUID作为附加列添加到Access表(表2)中,则可以将其用作查找表。

ROW_NUMBER()将返回唯一的数字,但每次使用它时都会再次从1开始,因此每个表的所有插入操作都需要在一个集合中完成。如果您在access中使用自动编号字段,这将在单独的插入中为您提供唯一的值。

既然现在在Access表中有了SQL的GUID和惟一ID,那么只要在插入到带有外键的表中时进行查找就行了,比如address表。因此,当您从带有GUID的SQL中插入地址来标识person时,连接access的Person表中的GUID并插入Person的整数ID。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10484046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档