数据库设计 - 一个数据库,多个网站

问题描述:

我知道这个问题之前已经问过很多次了,但是我找不到我的确切答案。所以请让我在这里问一下。数据库设计 - 一个数据库,多个网站

我们建立了一个CMS来控制一个站点。现在公司正在扩张,我们还有几个拥有几乎相同核心结构的网站。我们决定稍后与一个数据库一起进行维护。

我们有大约10张桌子。例如,页面,新闻,设置(每个网站都不同)...

如果我们为每个表格添加一个App_ID(或Site_ID)列,这听起来不是一个好主意,所以我们知道我们应该从哪个特定网站记录哪些记录。

例如,

PAGES: 
PageID | Body | SiteID 
1  | abc  | 1 
2  | cde  | 1 
3  | aafd  | 2 
4  | gsgs  | 2 
5  | feg  | 3 

我认为这是非常丰富的,以本SITEID列在此数据库添加到每个表。

我仔细看过Multi-Tenant Architecture,但我不知道如何将它应用到我们的网站CMS。

什么是处理这种情况的最佳方法,请帮助。任何启发感激。

简单代码

我们最近一直在审查多租户单一数据库的各种策略。

如果您不想向表中添加站点标识符,那么您可以为每个租户分配自己的模式和一组表。每个租户都可以拥有自己的连接字符串,只能访问他们的模式(显然你需要在运行时切换连接(如果你正在使用这些连接,就可以使用EF和NH)

但是,因为在我们的应用程序中引入了一个额外的级别,这样应用程序的每个组件(在您的案例中,News,Pages等)都被表示为数据库中的一个功能。

每个站点都有一个功能“实例“和为这些功能(博客可能有帖子,标签,类别)存储的数据都有对该功能实例(而不是网站)的引用。

这样做增加额外的复杂性,但我们发现它非常灵活,并将我们的功能数据从网站中分离出来(如果我们愿意,可以在网站之间移动功能实例)。

多个数据库将是推荐的方式,因为它允许简单的备份与单个站点的恢复。另外,如果您发现需要引入复制从服务器,则使用单独的数据库可以使复制效率更高。我所知的大多数多站点托管解决方案都使用多个数据库。

但是,如果您打算使用单个数据库,则另一种选择是使用指示它属于哪个站点的前缀来复制表。

混合答案。在一个类似的项目,相同的数据库结构,几个站点工作。

我们尝试了几个东西。

我们的“最佳实践”,“数据库规范化”,“设计模式”风扇,但是,我们最终用务实的态度,超过理论框架。

我们不得不为每个站点/公司一个或多个数据库,每个数据库表有一个“SITE_ID”,和它的工作。

我们有一些情况下,一个公司决定分拆其数据库站点为每个部门,这样一个数据库,成为多个数据库,有时在同一个数据库服务器中,有时不同的数据库服务器。

我们有一个情况下使用单中心公司,买一个规模较小的公司,增加了一个新的网站具有相同的数据库结构,并在5张赞成票,他们合并数据。

这几个网站加上“site_id”,效果很好。