我正在构建一个需要在一个数据库中包含大量表的应用程序,虽然数据的连接和聚合确实非常好且无缝,但我开始怀疑我是否在一个数据库中创建了太多表,而不是通过创建多个表来更好地组织数据库。
- 这是企业级公司的标准做法吗?
- 如果正常的话,您通常如何连接来自两个不同数据库的数据?
- 这会导致延迟问题吗?
任何帮助或指导都会有所帮助,
我正在构建一个需要在一个数据库中包含大量表的应用程序,虽然数据的连接和聚合确实非常好且无缝,但我开始怀疑我是否在一个数据库中创建了太多表,而不是通过创建多个表来更好地组织数据库。
任何帮助或指导都会有所帮助,
通常,应用程序本机生成的数据不会跨越多个数据库,尤其是企业级应用程序,除非有特殊的用例这样做。例如,某些 ERP(企业资源规划)系统将文件(例如 PDF 附件)直接存储在数据库中,而不是存储在磁盘上的文件共享中。作为减轻应用程序主数据库大小内爆的一种方法,他们将这些文件存储在一个特殊的单独数据库中。在数据库中存储文件通常是一个糟糕的设计选择,但这不是你问题的重点。
在多个数据库之间存储数据并没有什么可怕的,只是这样做没有太多好处,而且除了设计有点尴尬之外还有一些缺点。还有替代解决方案。
缺点
替代解决方案
使用同一个数据库中的模式来更好地组织数据对象,并在更细粒度的级别上改进安全管理。备份现在也是原子的,因为所有内容都位于单个数据库下。
模式是将相关数据对象分类在一起的好方法。例如,在 ERP 系统中,可能存在
Payroll
、Production
和 的应用程序模块和屏幕Sales
。在数据库层中,每个域都可以是同一 ERP 应用程序数据库中自己的模式。那么你的表格可能看起来像Payroll.Employees
,,,,,,,和,等等Payroll.Timecards
。Production.Products
Production.Components
Sales.SalesOrders
Sales.SalesLines
Sales.Customers
如上所述,有时您会遇到将多个数据库中的数据连接在一起的用例,例如当您将其他系统的数据一起拉入一个位置以供应用程序引用时。在这种情况下,我首先喜欢做的是在我的应用程序数据库中为每个源数据库创建一个单独的模式,例如,,等等
SourceDatabaseA
。SourceDatabaseB
然后在这些架构中创建视图,对相关源数据库中的对象进行跨数据库引用。例如:
这提供了一个抽象层来规范化源数据库中的名称和/或数据类型,并注入任何全局逻辑。最后,我将创建一个将多个源视图组合在一起的架构,以及这些对象所属的域的代表名称。例如,如果我从多个应用程序的数据库中提取销售数据,那么我将拥有一个
Sales
架构并创建一个视图,该视图将该架构中的所有源合并在一起,如下所示:不会,跨数据库查询或引用跨数据库对象的数据对象不会产生任何额外的可测量开销/延迟。
取决于您想要/期望什么样的输出。
这个想法可能有助于获得一般见解或报告或简单的数据清理。