数据库设计 - 一个数据库,多个网站
我知道这个问题之前已经问过很多次了,但是我找不到我的确切答案。所以请让我在这里问一下。数据库设计 - 一个数据库,多个网站
我们建立了一个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”,效果很好。