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

时间:2011-05-11 18:19:52

标签: asp.net database database-design multi-tenant

我知道这个问题之前已被问过很多次但是我找不到我的确切答案。所以请让我在这里问一下。

我们建立了一个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。

处理这种情况的最佳方法是什么,请帮忙。任何启蒙都表示赞赏。

简单代码

3 个答案:

答案 0 :(得分:1)

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

如果您不想在表中添加站点标识符,则可以为每个租户提供自己的架构和表集。每个租户都可以拥有自己的连接字符串,只能提供对其模式的访问(显然需要在运行时切换连接(如果使用这些连接,则很容易使用EF和NH)。

但是,我们选择的选项是在我们的应用程序中引入一个额外的级别,以便应用程序的每个组件(在您的情况下,新闻,页面等)都表示为数据库中的一个功能。

每个站点都有一组功能“实例”,并且为每个功能存储的数据(博客可能包含帖子,标签,类别)都引用了功能实例(而非网站)。

这确实增加了额外的复杂性,但我们发现它非常灵活,并将我们的要素数据与网站分离(如果我们愿意,可以在网站之间移动要素实例)。

答案 1 :(得分:1)

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

我们尝试过几种东西。

我们喜欢"最佳实践","数据库规范化","设计模式"但是,我们最终使用了一种实用的方法,而不是理论上的方法。

我们为每个站点/公司都有一个或多个数据库,每个数据库表都有一个" site_id",并且它有效。

我们遇到过一些公司决定为每个部门拆分数据库网站的情况,因此一个数据库有时会在同一个数据库服务器内成为多个数据库,有时也会成为不同的数据库服务器。

我们遇到过这样一个案例:一家公司拥有一个网站,购买一家规模较小的公司,增加了一个具有相同数据库结构的新网站,并且在5年后,他们合并了这些数据。

几个网站加上" site_id",运作良好。

答案 2 :(得分:0)

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

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