不同DBMS之间复制时如何避免数据冗余?

Posted

技术标签:

【中文标题】不同DBMS之间复制时如何避免数据冗余?【英文标题】:How to avoid data redundancy when copying between different DBMS? 【发布时间】:2011-10-09 15:59:37 【问题描述】:

我计划创建一个 VB.net 应用程序,用于从数据库 (MS Access) 检索数据并将其存储到 Web 服务器(mysql 数据库)。我心里真的很混乱。我打算使用任务调度程序,以便程序自动运行。我打算每 5 分钟设置一次时间。

如何避免数据冗余?

例如,我计划在 5 分钟内获得销售额,5 分钟后我将再次执行此操作。我认为在这种情况下会有冗余。我想问问你对这个场景的想法:你会如何处理它?

【问题讨论】:

那么先生,在这种情况下,它只取决于程序?避免冗余? 直接将销售数据输入 MySQL,而不是通过 Access db 文件。如果您有一个基于 Access 表单的数据输入应用程序,请将本机 (Jet/ACE) 表替换为指向其 MySQL 对应项的 ODBC 链接。保持 2 组独立的数据同步不再有问题。 @HansUp : 先生,我不知道如何用 ODBC 替换本机表。我要做的是创建一个可以从 Ms Access 获取数据的程序,然后将其放入Web服务器(MySQL)的数据库中,以便可以通过互联网访问。 【参考方案1】:

如果可能的话,您应该避免在这种情况下使用两个数据库。

查找有关链接表管理器的信息——Access 使用的数据不必存储在 Access 中。

http://www.mssqltips.com/sqlservertip/1480/configure-microsoft-access-linked-tables-with-a-sql-server-database/

如果您必须这样做,请参阅使用/升级到 Access 2010 并使用数据宏(触发器)将新的/更改的数据放入临时表中,一旦您将数据复制过来,就将其清除。

【讨论】:

【参考方案2】:

您在评论中说“我不知道如何用 ODBC 替换本机表”。

这是阻止您在 MySQL 中将数据整合到一组的唯一障碍吗?如果是这样,请尝试这个设置 ODBC 链接到 MySQL 表的建议。

如果您还没有,请为 MySQL 安装 ODBC 驱动程序。最新版本在这里:Download Connector/ODBC

从 Windows ODBC 数据源管理器为您的 MySQL 数据库创建 DSN(数据源名称)。

创建一个新的 Access 数据库并使用 DSN 在提供的网页链接 @jmoreno 的指导下创建链接。

如果链接表的 Access 名称与您最初用于本机 Access 表的名称不同,请更改它们以匹配这些原始名称。

然后您可以从旧的 Access 应用程序中导入您的表单、查询、报告等。 理想情况下一切都会正常工作,因为 Access 会找到它需要的表名,并且不会关心它们是外部表而不是本地表。但是,您需要解决 Access 和 MySQL 之间的任何数据类型不兼容问题。

您需要在每台使用 Access 应用程序的机器上安装 MySQL ODBC 驱动程序。就个人而言,我更愿意处理这个问题,而不是在单独的 Access 和 MySQL 数据存储之间进行同步的挑战。 (YMMV)

当您准备好部署时,您可以将 ODBC 链接转换为无 DSN 连接,这样客户端计算机就不需要每个都配置 DSN。有关详细说明,请参阅 Access MVP Doug Steele 的 Using DSN-Less Connections。

【讨论】:

【参考方案3】:

您需要非常仔细地考虑如何识别自上次同步周期以来发生更改的数据。如果每一行数据都有一个“最后更新”的时间戳(即被索引),那么您可以编写一个进程,依次从每个表中选择最近更新的行。这对原始数据库(MS Access)来说有点沉重,而且您仍然必须在 MySQL 数据库中识别要替换的相应行(需要替换的地方)。当然,您可以将不同的表放在不同的更改时间表上。例如,美国各州的表格可能一年不会改变一次,但您的客户订单表格(或 SO 问题和答案表格)可能会在五分钟内发生很大变化。

一些 DBMS 具有替代机制,尤其是在它们自身的副本之间工作时。一些 DBMS 还提供了一种有时称为“更改数据捕获”(CDC) 的机制,允许您获取更改的数据。有时,在您有“事务日志”或“逻辑日志”(但没有 CDC 或类似的东西)的 DBMS 中,您可以“挖掘”日志文件(或日志备份)以查找更改。但是,这些日志通常针对 DBMS 内部恢复过程进行了优化,而不是供您使用。

【讨论】:

先生。与我的查询有关吗?你能详细说明一下CDC吗? @Jonathan Leffler【参考方案4】:

好吧,显然您必须跟踪已处理的数据项(可能位于不同的元数据空间/数据存储中)以避免冗余。元数据应该用于过滤掉从源头处理过的记录。元数据中需要包含的逻辑和内容取决于此处的确切用例。

【讨论】:

以上是关于不同DBMS之间复制时如何避免数据冗余?的主要内容,如果未能解决你的问题,请参考以下文章

非关系数据库中如何避免冗余数据?

如何避免 Lambda 架构中的代码冗余?

MongoDB管理之副本集

实例化泛型类时如何避免指定冗余类型

导论-数据库

数据库的相关介绍