我有一个架构,我有一个主数据库MyMainDatabase
。然后我为每个新客户CustDb###
创建一个单独的数据库。在我的MainDatabase上,我有一个表来跟踪所有客户数据库CustomerDbTable
。
客户数据库有一个名为Invoices的表。发票ID是GUID,因此一次重复的概率非常小。
所以这是我的问题我必须经常查看一个发票,因为它的ID(GUID)。我不采取什么方法:
在MyMainDatabase中创建一个名为AllInvoices的表,其中包含IdOfInvoice,CustDatabaseName列。每次我在客户数据库上创建发票时,我也会在MyMainDatabase
创建一个查询,以便在多个数据库中搜索发票。我有数据库的名称。 我更喜欢这个apprach,因为每次创建新发票时我都要记得第一个,我必须记住在MainDatabase上创建它
答案 0 :(得分:2)
在Sql Server中,您可以使用dbName.Schema.TableName
进行访问 SELECT Invoice FROM [MyCustomerDb1].[dbo].[InvoiceTable]
WHERE <Condition...>
然后你可以将所有人联合起来从多个人那里获得。
SELECT Invoice FROM [MyCustomerDb1].[dbo].[InvoiceTable]
WHERE <Condition...>
UNION ALL
SELECT Invoice FROM [MyCustomerDb2].[dbo].[InvoiceTable]
WHERE <Condition...>
话虽如此,我认为如果它是一个解决方案并且将部署在一台服务器上,那么这是一个非常糟糕的架构,可以拥有一个单独的数据库。
如果要在多台服务器上部署,则需要AllInvoices表。
更好的解决方案是在主数据库中使用ForeignKey CustomerId创建一个发票表。
答案 1 :(得分:1)
有时,出于安全原因(主要),您需要为不同的客户端创建不同的数据库。如果你可以避免这种架构,那么这通常会让你的生活变得更简单。我认为你有充分的理由来构建这个架构。
鉴于这种情况,你可以采取任何一种方法。
如果要将发票仅存储在原始源数据库中,则需要动态SQL才能访问它们。换句话说,您应该有一个存储过程,它将创建动态SQL,然后使用MyMainDatabase
中的数据库列表返回发票集。您需要手动检查适当的安全性。
我实际上更喜欢第一种方法(中央表),尽管它确实有一些额外的复杂性。如果发票更改,则您需要将更新传播到主数据库。这成为数据传播问题。但是,使用触发器很容易实现。当数据库实际位于不同的服务器上时,会出现一个挑战。然后,您必须考虑到某些数据库(包括主数据库)可能已关闭。
如果数据库都在同一台服务器上,您可以使用混合方法。在这种方法中,您将在主数据库中拥有一个视图,该视图将来自不同数据库的发票汇集在一起。您将拥有一个存储过程,可以在添加或删除新数据库时重新生成视图。
我认为没有正确的答案。只有符合您要求的实用方法才能更好或更差。
答案 2 :(得分:0)
是否可以根据登录信息查找相应的连接信息?您可以将用户映射到中央数据库中的特定客户数据库(或允许在应用程序中选择所述客户数据库)然后,可以直接针对客户发票集编写所有查询。
如果你确实需要维护单独的数据库并按照描述在所有所述数据库中进行搜索,那么我会使用你的第二种方法。但是,如果应将关键发票信息集中编入索引以进行快速全局搜索,则应将此密钥数据提取到中央数据库中。