2014-02-26 53 views
0

我有一个架构,我有一个主数据库MyMainDatabase。然后我为每个新客户CustDb###创建一个单独的数据库。在我的MainDatabase上,我有一张表来跟踪所有客户数据库CustomerDbTable用一个查询查询多个数据库

customers数据库有一个叫做Invoices的表。发票ID是一个GUID,因此重复的概率非常小。

所以这里是我的问题我必须经常看一个发票给它的id(GUID)。我不应采取何种方针:

  1. 创建一个表MyMainDatabase称那将有列IdOfInvoice,CustDatabaseName AllInvoices。每次我在客户数据库上创建发票时,我还会创建一个记录MyMainDatabase

  2. 创建一个查询,可以在多个数据库中搜索发票。我有数据库的名称。 我会在每次我创建一个新的发票我一定要记得还创建它的MainDatabase

+0

您是否认为您的数据库体系结构可能存在根本性缺陷? –

+0

你可以像这样使用字段/表的名字... select databaseab1.1.namename.fieldname,database2.tablename.fieldname from database1.tablename join database2.tablename on database1.tablename.id = database2.tablename.id – kwelsan

+0

基于这个问题我选择了使用这种方法http://stackoverflow.com/questions/18910519/pros-cons-using-multiple-databases-vs-using-single-database现在我可以在客户端使用WCF数据服务并拥有该客户端只对他的数据库进行查询。 –

回答

2

在SQL Server中,你可以访问使用dbName.Schema.TableName

SELECT Invoice FROM [MyCustomerDb1].[dbo].[InvoiceTable] 
    WHERE <Condition...> 

然后,您可以UNION ALL从多个获得。

SELECT Invoice FROM [MyCustomerDb1].[dbo].[InvoiceTable] 
    WHERE <Condition...> 
    UNION ALL 
    SELECT Invoice FROM [MyCustomerDb2].[dbo].[InvoiceTable] 
    WHERE <Condition...> 

话虽这么说,我觉得这是一个非常不好的架构有一个单独的数据库,如果它是一个解决方案,将被部署在一台服务器上。

如果要在多个服务器上部署,则需要AllInvoices表。

更好的解决方案是使用ForeignKey CustomerId在主数据库中有一张发票表。

1

有时时间比较喜欢这个apprach因为放在了第一位,出于安全原因(主要是)你需要创建不同数据库为不同的客户。如果你能避免这种架构,那一般会让你的生活变得更简单。我认为你对这个架构有很好的理由。

鉴于这种情况,您可以采取任何一种方法。

如果您打算仅将发票存储在原始源数据库中,那么您将需要动态SQL才能访问它们。换句话说,您应该有一个存储过程,它将创建动态SQL,然后使用MyMainDatabase中的数据库列表返回该组发票。您需要手动检查适当的安全性。

我其实更喜欢第一种方法(中心表),尽管它确实有一些额外的复杂性。如果发票更改,则需要将更新传播到主数据库。这成为数据传播问题。但是,使用触发器很容易实现。当数据库实际位于不同的服务器上时,就会出现一个挑战。那么你必须考虑到一些数据库(包括主数据库)可能停机。

如果数据库都在同一台服务器上,你可以使用一个混合的方法。在这种方法中,您可以在主数据库中查看来自不同数据库的发票。您将有一个存储过程,可在新数据库添加或删除时重新生成视图。

我不认为这是一个正确的答案。只有符合您的要求的实用方法更好或更差。

0

是否可以根据登录名查找适当的连接信息?您可以将用户映射到中央数据库中的特定客户数据库(或允许在应用程序内选择所述客户数据库)。然后,所有查询都可以直接针对客户发票集编写。

如果您确实需要维护单独的数据库并按照所述的方式在所有数据库中进行搜索,请使用第二种方法。但是,如果主要发票信息应集中编入索引进行快速全局搜索,则应将此关键数据提取到中央数据库中。