每个 country/region 架构的数据库

Database per country/region architecture

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

的一个区域中

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

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

是否有特定的应用程序架构来描述这种情况? 有例子吗?

您可以使用弹性查询来连接来自不同 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

弹性数据库客户端库在 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 处理迁移。我在启动时实现了一个循环,它会在每个数据库上显式调用 "apply migrations"。挑战在于 EF Code First 不希望您拥有多个数据库,因此您必须实现迁移代码可以使用的自定义连接工厂。我不记得具体的细节了,但是如果你想手动解决这个问题并先使用 EF 代码,请告诉我,我会尝试挖掘代码。