我们有一个使用通用表设计的规范化SQL Server 2008数据库。因此,我们没有为每个实体(例如Products,Orders,OrderItems等)提供单独的表,而是拥有通用表(实体,实例,关系,属性等)。
我们决定使用单独的非规范化数据库来快速检索数据。你可以告诉我各种技术同步这两个数据库,假设它们有不同的模式吗?
干杯, MOSH
答案 0 :(得分:3)
当两个数据库具有完全不同的模式时,您应该关注数据迁移或复制的技术,而不是同步。 SQL Server为此提供了两种技术,SSIS和Replication,或者您可以编写自己的脚本来执行此操作。
复制将从源数据库中获取新数据或已修改数据,并将其复制到目标数据库。它提供了调度,打包和分发更改的机制,可以处理实时更新和批量更新。要工作,需要在两个数据库中添加足够的信息来跟踪修改和匹配行。在您的情况下,很难确定哪些“产品”已更改,因为您必须在4个或更多不同的表中标识所有相关的修改行。它可以完成,但需要一些努力。在任何情况下,您都必须创建与目标模式匹配的视图,因为复制不允许对源数据进行任何转换。
SSIS将从一个来源提取数据,对其进行转换并将其推送到目标。它没有用于跟踪更改的内置机制,因此您必须向表中添加字段以跟踪更改。它严格来说是一个可以按计划运行的批处理过程。主要的好处是,您可以执行各种转换,而复制几乎不允许(除了从视图中绘制数据)。您可以创建数据流,仅在产品相关属性记录更改时修改相关的产品字段,或者只是重新构建整个产品记录并覆盖目标记录。
最后,您可以创建自己的触发器或存储过程,这些触发器或存储过程将在数据更改时运行并将其从一个数据库复制到另一个数据库。
我还应该指出,您可能已经过度规范化了数据库。在所有这三种情况下,当您加入所有表以重构实体时,将会有一些性能损失,从而导致更大量的锁定,这是必要的,并且索引的使用效率低下。为了便于更改,您正在牺牲性能和可伸缩性。
也许你应该看一下SQL Server 2008的稀疏列功能,以便在保持性能和可伸缩性的同时支持灵活的模式。