每个客户的新数据库或索引键?

时间:2013-05-08 14:57:20

标签: database-design sql-server-2012

我们目前正在使用ASP.net和Microsoft SQL Server 2012构建Web应用程序。 我们的每个客户都可以在其下方添加其他客户。

我们的公司 - >我们的顾客     --->客户的客户

是否最好为我们的每个客户创建一个新数据库,或者只使用一个单独的表并在其GUI中自动应用密钥过滤器?

2 个答案:

答案 0 :(得分:0)

根据您所描述的(简要),我不建议为每个客户端分别使用DB。如果每个客户端都有自己的应用程序/网站,那么是的,您可能希望每个客户端都有自己的数据库实例(以及应用程序,服务器等)。在这种情况下,似乎每个客户端都需要彼此交互。如果它们位于各种数据库中,则很难做到。相反,请查看为客户创建使用递归表的规范化数据库模式。您可以创建类似于以下内容的模式:

<强> tblOurCompany

companyId(pk int)

的companyName(VARCHAR) ....

<强> tblOurCustomers

custId(pk int)

CUSTNAME(VARCHAR)

custParent(int)的

<强> tblCompany_Customer

companyId(PK)

客户ID(PK)

这个快速模拟是一个包含公司表的表(假设您有多个公司或者这可能是业务单位)和一个客户表。因为您可能有多个公司拥有多个客户,所以您需要有一个表将两者统一起来,即company_customers表。然而,这种设计的关键是客户表的递归设计。每个表都有一个customerID,它是主键,也是父ID。父ID只是在customer表中找到的另一个客户的pk(根父级可以具有值0)。例如:

companyId | companyName  | ParentId
-----------------------------------
1             CompanyA     0
2             CompanyB     0
3             CompanyC     1
4             CompanyD     1
5             CompanyE     4

这个例子有5家公司。两个是根公司(CompanyA / B)。 CompanyA有两个孩子(C和D)。 CompanyE有一个孩子,CompanyD。

理解数据库规范化非常重要。如果你是按照你的第一个倾向为每个客户使用不同的数据库,那么你将花费更多的钱(数据库许可证需要花钱+服务器成本+空间等)并且在获取数据方面造成不必要的困难并使用SQL和任何可能正在使用它的应用程序使用它。下面是对标准化的快速介绍:http://databases.about.com/od/specificproducts/a/normalization.htm

如果您有任何其他问题,请与我们联系。

答案 1 :(得分:0)

这一切都取决于预期的规模。如果您希望“我们的客户”为10,那么单独的数据库可能正常工作,但要了解多个数据库的管理成本增加。

但是,如果“我们的客户”长期为100或1,000,那该怎么办?您想管理1,000个个人数据库吗?

这里的一个很好的参考是微软的Multi-Tenant Data Architecture

我的个人建议(基于两个生产SaaS系统的经验)是拥有一个数据库和一个表。

客户表(将此视为租户):

  • PK:TenantID

客户(租户)客户表:

  • PK:TenantID,CustomerID
  • FK:TenantID