Sql server 每个应用程序的数据库与所有应用程序的一个大型数据库

Sql server 每个应用程序的数据库与所有应用程序的一个大型数据库,sql-server,database,database-design,architecture,referential-integrity,Sql Server,Database,Database Design,Architecture,Referential Integrity,我正在设计一些应用程序,它们将共享2或3个数据库表,并且所有其他表都将独立于每个应用程序。共享数据库主要包含用户信息,可能会出现其他表需要共享的情况,但这是我的直觉 我倾向于使用“一个数据库所有应用程序”解决方案,因为我希望具有引用完整性,并且我不必在每个数据库中保持相同的信息最新,但我可能会以一个包含100多个表的数据库结束,其中只有一组包含10个表的数据库才具有相关信息 “每个应用程序的数据库”方法帮助我使所有内容更有条理,但我不知道如何使所有数据库中的相关表保持最新 所以,基本的问题是:你

我正在设计一些应用程序,它们将共享2或3个数据库表,并且所有其他表都将独立于每个应用程序。共享数据库主要包含用户信息,可能会出现其他表需要共享的情况,但这是我的直觉

我倾向于使用“一个数据库所有应用程序”解决方案,因为我希望具有引用完整性,并且我不必在每个数据库中保持相同的信息最新,但我可能会以一个包含100多个表的数据库结束,其中只有一组包含10个表的数据库才具有相关信息

“每个应用程序的数据库”方法帮助我使所有内容更有条理,但我不知道如何使所有数据库中的相关表保持最新

所以,基本的问题是:你推荐这两种方法中的哪一种

谢谢

豪尔赫·瓦尔加斯

编辑1:

当我谈到不能具有引用完整性时,这是因为当表位于不同的数据库中时,表中不可能有外键,并且每个应用程序中至少有一个表需要一个共享表的外键

编辑2:

相关问题的链接:

只有第二个答案是可以接受的。还没有决定要做什么

回答:

我决定为每个应用程序使用一个数据库,对共享数据库进行跨数据库引用,向每个数据库添加视图,模仿共享数据库中的表,并使用NHibernate作为我的ORM。作为会员制,我将使用asp.net

我还将使用触发器和逻辑删除,以尽量减少在没有父母的情况下在livin'la vida loca周围飞行的ID数量。保持数据库同步所需的开发工作太多,回报太少(正如大家所指出的)。所以,我宁愿在孤儿唱片中挣扎

因为使用ORM和视图是svinto首先提出的,所以他得到了正确的答案


感谢大家帮助我做出了这个艰难的决定。

这取决于您所使用的数据库和框架,您的选择也有所不同。我建议您使用某种ORM,这样您就不需要太麻烦了。无论如何,您可能会将每个应用程序放在数据库中它自己的模式中,然后通过schemaname.tablename引用共享表,或者在每个应用程序模式中创建视图,这只是从schemaname.tablename中选择*的
,然后根据该视图进行编码。

我认为所有应用程序都有一个数据库。数据将是储存一次,不重复


如果使用另一种方法,您最终将进行复制,在我看来,当您开始复制时,它会带来自己的头痛,数据也会失去同步

这两种方法都不理想

我认为你应该考虑不要在数据库层中引用交叉应用关系,并在应用层中进行引用。这将允许您将其拆分为每个应用程序的一个数据库


我正在开发一个包含100多个表格的应用程序。我把它们放在一个数据库中,并用前缀隔开——每个表都有它所属模块的前缀。然后,我在数据库函数之上构建了一个层来使用这个自定义组。我还在构建data administrator,它利用了这个表组,使编辑数据变得非常容易。

没有硬性的规则来选择其中一个

多个数据库提供模块化。就跨多个数据库同步而言,可以使用链接服务器及其视图的概念,还可以获得集成数据库(统一访问)的优势

此外,保留多个数据库有助于更好地管理安全性、数据、备份和恢复、复制、扩展等


My 2cents.

从可伸缩性和维护的角度来看,最合适的方法是使“共享/公共”表子集自给自足,并将其放入“commons”数据库,因为所有其他表在每个逻辑范围(已确定业务逻辑)的每个应用程序中都有1 db,并始终维护此结构


这将简化您软件的计划和执行调试/退役/重新定位/维护程序(如果您知道要接触哪个应用程序,您将确切知道涉及哪两个受影响的数据库(commons+app_特定),反之亦然。

这听起来根本不像“很多应用程序”,但类似于“一个具有不同可执行文件的应用程序系统"。当然,他们可以共享一个数据库。巧妙地利用模式来隔离一个数据库中的不同功能区域。

在我们的业务中,我们为每个应用程序使用单独的数据库,为少量共享信息提供跨数据库引用,偶尔还提供一个链接服务器。这在开发、分段、构建和生产环境

对于用户,我们的整个用户群都在windows上。我们使用Active Directory管理用户,并使用应用程序引用组,这样应用程序就不必管理用户,这很好。我们没有集中组管理,即每个应用程序都有组表和安全性,这不太好,但很有效

如果你的应用程序真的不同,我建议每个应用程序都有一个数据库。回头看,用户的中央共享数据库听起来也是可行的

您可以使用触发器实现跨数据库引用完整性:

创建一个链接到保存要引用的数据库的服务器的服务器。然后使用4部分命名来引用保存引用数据的远程数据库中的表。然后将其放入表的insert和update触发器中

E
DECLARE @ref (datatype appropriate to your field)

SELECT @ref = refField FROM inserted

IF NOT EXISTS (SELECT *
FROM referenceserver.refDB.dbo.refTable
WHERE refField = @ref)
BEGIN
RAISERROR(...)
ROLLBACK TRAN
END