【问题标题】:Why use database schemas?为什么使用数据库模式?
【发布时间】:2021-03-25 03:15:37
【问题描述】:

我正在处理具有多个数据库架构的单个数据库,

例如
[Baz].[Table3],
[Foo].[Table1],
[Foo].[Table2]

我想知道为什么除了组织和权限之外,表还以这种方式分开。

这种情况有多普遍,还有其他好处吗?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    在逻辑上将对象分组在一起并允许在架构级别设置权限方面,您具有主要优势。

    它确实在编程中提供了更多的复杂性,因为您必须始终知道您打算从哪个模式获取某些东西 - 或者依赖用户的默认模式才能正确。同样,您可以使用它来允许在不同架构中使用相同的对象名称,以便代码只针对一个对象写入,而用户默认使用的架构决定哪个是。

    我不会说这很常见,有趣的是大多数人仍然将所有内容都丢弃在 dbo 架构中。

    【讨论】:

      【解决方案2】:

      除了组织和权限之外,我不知道任何其他可能的原因。这些还不够好吗? :)

      为了记录 - 我总是使用单一模式 - 但是我正在创建 Web 应用程序并且也只有一个用户。

      10 年后更新!

      其实还有一个原因。您可以出于不同目的拥有架构的“副本”。例如,假设您正在创建一个博客平台。人们可以注册并创建自己的博客。每个博客都需要一个用于帖子、标签、图像、设置等的表格。一种方法是添加一列 blog_id 到每个表并使用它来区分博客。或者......您可以为每个博客创建一个新架构并为每个博客创建新表。这有几个好处:

      • 编程更容易。您只需在开始时选择适当的架构,然后编写所有查询,而不必担心忘记在某处添加 where blog_id=@currentBlog
      • 您避免了一整类潜在的错误,其中一个博客中的外键指向另一个博客中的对象(意外数据泄露!)
      • 如果要擦除博客,只需删除包含所有表的架构即可。比从几十个不同的表中查找和删除记录要快得多(以正确的顺序,同样如此!)
      • 每个博客的性能仅取决于(嗯,大部分情况下)博客中有多少数据。
      • 导出数据更容易 - 只需转储架构中的所有对象。

      当然也有缺点。

      • 当您更新平台并需要执行架构更改时,您需要分别更新每个博客。 (稍后添加:这实际上可能是一项功能!您可以执行“滚动更新”,而不是同时更新所有博客,而是批量更新它们,看看是否有任何错误或在更新下一批之前投诉)
      • 无论出于何种原因,修复损坏的数据也是如此。
      • 所有平台的统计数据更难计算

      总而言之,这是一个非常小众的用例,但它可以很方便!

      【讨论】:

      • 那么你在这种情况下动态创建模式?
      • @julealgon - 是的。尽管这显然应该是一件相对罕见的事情。我不确定博客平台是否是最好的例子,尽管它确实很好地说明了这一点。在现实生活中,我已经看到这被用于会计软件,其中一个数据库可以包含多家公司的数据。这在出于各种法律目的而“在纸上”将一个实际公司拆分为多个子公司的情况下很有用。一种常见的做法,或者我理解。由于添加新的子公司根本不是常见的操作,因此这种方法非常实用。
      • @julealgon - 此外,将“多公司功能”添加到软件时,这可能是最简单的方法。 :D
      • @julealgon - 我不知道。我指的会计软件是一个旧的,用 Delphi 编写的,有很多遗留的废话……当然不是可以从中汲取灵感的东西。但是其中有几个成功的或至少有趣的想法;我认为这是其中之一。 EntityFramework 和迁移虽然......你必须在这里跳出框框思考。如上所述,在这种设置中,部署变得更加复杂。但也有新的机会,比如滚动部署。
      • @julealgon - 要考虑的另一件事是 - 好吧,您预计会有多少租户?如果您正在制作 wordpress.com,它实际上承载了 数千个 博客,那么鉴别器字段实际上可能会更好。我不知道如果 MySQL/MSSQL/Oracle/whatever 有数千个模式会如何表现。也许它不在乎,也许它会受苦。
      【解决方案3】:

      对我来说,它们会导致更多问题,因为它们破坏了ownership chaining

      例子:

      存储过程tom.uspFoo 很容易使用表tom.bar,但在dick.AnotherTable 上需要额外的权限。这意味着我必须将dick.AnotherTable 上的选择权限授予tom.uspFoo 的调用者...这会公开直接表访问。

      除非我完全错过了什么......

      2012 年 2 月编辑

      我问了一个关于这个的问题:SQL Server: How to permission schemas?

      关键是“同一所有者”:因此,如果 dbo 同时拥有 dicktom 架构,则所有权链接确实适用。我之前的回答错了。

      【讨论】:

        【解决方案4】:

        这样做有好处的原因有几个:

        • 在多个(实例)之间共享数据 的)应用程序。这可能是 如果您有参考组 之间共享的数据 应用程序和一组数据 这是特定于实例的。注意不要在不同模式中的实体之间进行循环引用。这意味着没有从架构 1 中的实体到架构 2 中的另一个实体的外键,并且在其他实体中没有从架构 2 到架构 1 的另一个外键。

        • 数据分区:允许将数据存储在不同的服务器上 更容易。

        • 如您所述,数据库级别的访问控制

        【讨论】:

          猜你喜欢
          • 2013-05-01
          • 1970-01-01
          • 2016-12-04
          • 1970-01-01
          • 2010-11-04
          • 2012-05-15
          • 2011-01-28
          • 2013-02-17
          • 1970-01-01
          相关资源
          最近更新 更多