【问题标题】:Database per country/region architecture每个国家/地区架构的数据库
【发布时间】:2018-06-13 04:51:23
【问题描述】:

目前我们有一个包含 SQL 数据库的网站。两者都托管在 Azure 的一个区域中

我有一个业务请求,将我们美国客户的所有数据存储在美国数据中心,不进行复制。因此,我们需要托管在不同地区(美国、欧盟、亚洲)的多个数据库(相同的架构、不同的数据)。

我们的 API 如何将所有数据库中的数据整合在一起仍有待决定,但我愿意接受建议。

是否有描述此场景的特定应用程序架构? 有例子吗?

【问题讨论】:

  • 你在使用实体框架吗?我已经多次处理过这种情况,而且相对容易。主要工作是创建数据库和更新模式,因为您必须与 EF 进行一些斗争。在那之后,主要是你需要一个工厂来给你每个客户正确的分贝。 EF 现在对此有一些原生支持,虽然我自己没有尝试过。
  • 我认为 docs.microsoft.com/en-us/azure/sql-database/… 可能对您很感兴趣,您可以运行跨 Azure SQL 数据库中多个数据库的 Transact-SQL 查询。
  • @Frans,是的,我们正在使用 EF。

标签: azure azure-sql-database infrastructure azure-sql-server


【解决方案1】:

Elastic Database Client Library 在 EF 中为此提供支持,请参阅 https://docs.microsoft.com/en-us/azure/sql-database/sql-database-elastic-scale-use-entity-framework-applications-visual-studio

本质上,它允许您设置规则来确定用于特定请求的数据库,因此您可以为每个客户拥有一个数据库。

我没有亲自使用过这个库,但我自己之前亲自动手过过它。如果你自己做,模式基本上是这样的; 您创建一个主数据库,其中包含所有客户的列表,包括有关他们所在区域的信息。 然后,您创建一个工厂,该工厂将为给定的客户创建一个数据库连接字符串,然后设置您的代码,以便当它需要一个 DbContext 时,它会询问工厂,然后工厂将构造连接字符串并创建一个具有正确连接的 DbContext字符串。

首先使用 EF 代码,将自动为您创建数据库。 困难的部分是使用 Code First 处理迁移。我在启动时实现了一个循环,它将显式调用每个数据库上的“应用迁移”。挑战在于 EF Code First 不希望您拥有多个数据库,因此您必须实现迁移代码可以使用的自定义连接工厂。我不记得我脑海中的确切细节,但如果你想手动处理这个并首先使用 EF 代码,请告诉我,我会尝试挖掘代码。

【讨论】:

    【解决方案2】:

    您可以使用弹性查询来连接来自不同 Azure SQL 数据库的表,如 here 所述。您必须创建如下所示的外部数据源:

    CREATE EXTERNAL DATA SOURCE RemoteReferenceData
    WITH
    (
        TYPE=RDBMS,
        LOCATION='myserver.database.windows.net',
        DATABASE_NAME='ReferenceData',
        CREDENTIAL= SqlUser
    );
    
    CREATE EXTERNAL TABLE [dbo].[zipcode](
        [zc_id] int NOT NULL,
        [zc_cityname] nvarchar(256) NULL,
        [zc_zipcode] nvarchar(20) NOT NULL,
        [zc_country] nvarchar(5) NOT NULL
    )
    WITH
    (
        DATA_SOURCE = RemoteReferenceData
    );
    

    详细了解弹性查询here

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多