如何管理共享和可自定义的表

时间:2009-11-11 14:23:37

标签: c# sql-server linq-to-sql views

我们有许多客户端使用我们的应用程序,并且每个客户端在我们的MS SQL Server上都有自己的,结构相同的数据库。我们还有一个中心数据库,用于不变的信息,因此在所有客户端之间共享,例如USPS邮政编码数据库。每个客户端数据库都有这些表的视图,如下所示:

create view V_ZIPCode as
select ID, ZIP, City, State
from SharedDB..ZIPCode

客户端无权修改SharedDB中的数据。

但是,有些表格中的数据将主要共享 - 但客户可能希望添加一些自己的记录。

所以我想知道如何最好地实现这种情况。

我可以将表放在客户端数据库上并使用共享记录预先填充每个客户端 - 但这看起来太过沉重和不优雅。当然,如果共享记录因任何原因而更新,则更改将不会自动传播到客户端;我必须将数据复制到所有客户端数据库,这是非常讨厌的。

我的另一个想法是在SharedDB和客户端数据库中创建相同的表,然后在客户端数据库上创建一个视图,如下所示:

create view V_MyTable as
select ID, Description, convert(bit, 0) IsClientData from SharedDB..MyTable
union
select ID, Description, 1 from MyTable

为了防止ID重复,我可以在客户端表上以非常高的数量播种身份值,例如1,000,000(比我在中央数据库中使用的更多;这些是非常稳定的查找值);我不确定我是否需要IsClientData字段,但这是一个小细节。客户端可以使用视图选择他们想要的任何内容,但他们只能在自己的数据库中修改表中的数据。

这种方法有一些我可以看到的缺点:首先,我不能在任何引用此视图的表上使用外键 - 但我猜这是对不同数据库的任何引用的情况。另一个是我不确定这个视图在查询中的效率如何。

你能看到这种方法会引入的其他问题吗?你能推荐任何优化吗?或者你会推荐一种不同的方法吗?

如果它有所不同,应用程序的业务层使用Linq-to-Sql用C#编写。

1 个答案:

答案 0 :(得分:1)

禁止(正如你所说)在整个系统中传播数据,对我来说似乎非常可靠。

以下是将所有数据存储在一个中心位置的方法概述。你必须将这一点充实,找出命名约定和可更新的视图皱纹和诸如此类的东西。我觉得它很优雅,但优雅可能会被高估。

--  In SharedDB
CREATE TABLE CentralTable
 (
   Id              int           not null  identity(1000000, 1)
  ,OwningClientDB  sysname       null
  ,YourDataHere    varchar(100)  not null
  --  Toss in stuff like who added it, when it was added, etc.)
 )

正如您所提到的,所有常见数据都通过SET IDENTITY_INSERT CentralTable ON添加,Id值低于1,000,000,Owning ClientDB为null。然后,在每个客户端DB中:

--  In client DB
CREATE VIEW vCentralTable (Id, OwningClientDB, YourDataHere, etc.) as
 select Id, OwningClientDB, YourDataHere, etc.
  from SharedDB.dbo.CentralTable
  where isnull(OwningClientDB, db_name()) = db_name()

该视图会过滤掉给定客户端可以看到的行。我根据数据库名称建立了过滤器,但可能有更有效的方法,具体取决于您如何识别“拥有”客户端。