ChatGPT解决这个技术问题 Extra ChatGPT

SQL Server 架构有什么好处?

我不是使用 SQL 数据库的初学者,尤其是 SQL Server。但是,我主要是使用 SQL 2000 的人,并且一直对 2005 年及以后的模式感到困惑。是的,我知道架构的基本定义,但它们在典型的 SQL Server 部署中真正用于什么?

我一直只使用默认模式。为什么我要创建专门的模式?为什么我要分配任何内置模式?

编辑:澄清一下,我想我正在寻找模式的好处。如果您只打算将其用作安全方案,那么似乎数据库角色已经填补了那个.. er.. um.. 角色。并且使用它作为命名空间说明符似乎是您可以通过所有权完成的事情(dbo 与用户等)。

我想我的意思是,Schemas 做了哪些所有者和角色不能做的事情?它们的具体好处是什么?


P
Palec

模式在逻辑上将表、过程、视图组合在一起。 employee 架构中所有与员工相关的对象等。

您还可以仅授予一个模式的权限,以便用户只能看到他们有权访问的模式,而不能看到其他任何内容。


从管理的角度来看,将权限分配给模式的可能性使其值得。
你不能使用一个单独的数据库吗?
这种模式许可在纸上听起来不错……但很少被正确使用。对我来说,这不值得麻烦。
但如果是这样的话,你不能使用命名约定来达到同样的效果吗?我并不是说没有用例。它通常是减法加法。
@Ajedi32,是的...使用模式,您可以在单个事务日志中获得单个原子提交,并一次性备份所有数据,而不是拥有两个不同步的数据库以及对抗分布式事务。
a
airbai

就像 C# 代码的命名空间一样。


不幸的是但是,从 ORM 的角度(即实体框架)来看,模式和 .NET 命名空间不能很好地协同工作。 MyDatabase.MySchema 架构中的表不会神奇地映射到 MyProject.MyDatabase.MySchema 命名空间中的实体类。还值得注意的是,表名中的任何点表示法 (.) hack 最终都会在类名中作为下划线 (_)。只是不幸的想法的食物。
教学的好比喻。我不认为它是 100% 从字面上理解的......(这些警告在实践中听起来很小)
就我个人而言,我希望它们更像 .NET 命名空间,这样可以出于组织目的嵌套任意数量的模式(就像使用命名空间一样)。那,我希望他们能在 EF 中映射得更好。
它们不像我能想到的任何语言的名称空间。
J
Joel Coehoorn

它们还可以为插件数据提供一种命名冲突保护。例如,SQL Server 2008 中新的变更数据捕获功能将它使用的表放在单独的 cdc 架构中。这样,他们就不必担心 CDC 表和数据库中使用的真实表之间的命名冲突,并且可以故意隐藏真实表的名称。


t
tobi18

我知道这是一个旧线程,但我自己只是研究了模式,并认为以下可能是模式使用的另一个很好的候选者:

在数据仓库中,由于数据来自不同的来源,您可以为每个来源使用不同的模式,然后例如基于模式控制访问。还避免了各种来源之间可能的命名冲突,正如上面另一位发帖人所回答的那样。


H
Hogan

如果您保持架构离散,则可以通过将给定架构部署到新数据库服务器来扩展应用程序。 (这假设您有一个足够大以具有不同功能的应用程序或系统)。

例如,考虑一个执行日志记录的系统。所有日志记录表和 SP 都在 [logging] 模式中。日志是一个很好的例子,因为系统中的其他功能很少(如果有的话)会与日志模式中的对象重叠(即加入)。

使用此技术的提示——在您的应用程序/系统中为每个模式使用不同的连接字符串。然后将架构元素部署到新服务器并在需要扩展时更改连接字符串。


J
Jason D.H.

在我工作多年的 ORACLE 商店,模式用于封装适用于不同前端应用程序的过程(和包)。每个应用程序使用不同的“API”模式通常是有意义的,因为用例、用户和系统要求完全不同。例如,一个“API”模式用于开发/配置应用程序,仅供开发人员使用。另一个“API”模式用于通过视图和过程(搜索)访问客户端数据。另一个“API”模式封装的代码用于将开发/配置和客户端数据与拥有自己数据库的应用程序同步。这些“API”模式中的一些,在其合理的情况下,仍然会彼此共享通用过程和功能(通过其他“通用”模式)。

我会说没有模式可能不是世界末日,尽管它可能非常有用。确实,SQL Server 中缺少包确实在我的脑海中产生了问题……但这是一个不同的话题。


对于 Oracle,由于 1 个实例 = 1 个数据库 = 1 个许可付费,人们使用 shemas 来避免创建另一个数据库并为另一个许可付费。在 SQl Server 中,一台服务器可以处理大量数据库。
s
sam yi

我倾向于同意布伦特的观点……请参阅此处的讨论。 http://www.brentozar.com/archive/2010/05/why-use-schemas/

简而言之......除了非常特定的用例之外,模式并不是非常有用。让事情变得一团糟。如果您能提供帮助,请不要使用它们。并尝试遵守 K(eep) I(t) S(imple) S(tupid) 规则。


我不认为 Brent 认为“模式不好”,只是使用非默认模式比仅使用默认模式复杂得多。你的其余部分是准确的。
“如果 [模式] 使用得当,它们可以让您按对象组隔离权限。” 〜brentozar.com/archive/2010/05/why-use-schemas
帖子倒退了,命名约定是带有💄的模式
s
stormy

我没有看到将与模式绑定的用户混叠的好处。这就是为什么....

大多数人最初通过角色将他们的用户帐户连接到数据库,一旦您以任何形式将用户分配给系统管理员或数据库角色 db_owner,该帐户要么别名为“dbo”用户帐户,要么具有完整的数据库的权限。一旦发生这种情况,无论您如何将自己分配给默认架构(与您的用户帐户同名)之外的方案,这些 dbo 权限都会分配给您在用户和架构下创建的那些对象。它有点毫无意义……只是一个命名空间,混淆了这些对象的真正所有权。如果你问我,它的设计很糟糕......无论是谁设计的。

他们应该做的是创建“组”,并丢弃模式和角色,只允许您以您喜欢的任何组合对组组进行分层,然后在每一层告诉系统权限是否被继承、拒绝或被自定义覆盖那些。这将更加直观,并允许 DBA 更好地控制这些对象的真正所有者。现在它在大多数情况下暗示 dbo 默认 SQL Server 用户拥有这些权限....而不是用户。


d
dkretz

我认为模式就像很多新功能(无论是 SQL Server 还是任何其他软件工具)。您需要仔细评估将其添加到您的开发套件的好处是否可以抵消设计和实现中的简单性损失。

在我看来,模式大致相当于可选的命名空间。如果您处于对象名称冲突且权限粒度不够精细的情况,这里有一个工具。 (我倾向于说可能存在应该首先在更基本的层面处理的设计问题。)

问题可能是,如果它存在,一些开发人员会开始随便使用它来获取短期利益;一旦它在那里,它就可以变成葛根。


T
Tariq Awan

在 SQL Server 2000 中,创建的对象链接到该特定用户,例如,如果用户说 Sam 创建了一个对象,比如员工,则该表将显示为:Sam.Employees。如果 Sam 离开公司或搬到其他业务领域怎么办?删除用户 Sam 后,Sam.Employees 表会发生什么情况?可能,您必须首先将所有权从 Sam.Employees 更改为 dbo.Employess。 Schema 提供了解决此问题的解决方案。 Sam 可以在诸如 Emp_Schema 之类的模式中创建他的所有对象。现在,如果他在 Emp_Schema 中创建一个对象 Employees,那么该对象将被称为 Emp_Schema.Employees。即使需要删除用户帐户 Sam,架构也不会受到影响。


这不再是真的,因为自 2000 年以来已经有两个新版本
N
Nick Van Brunt

开发 - 我们的每个开发人员都有自己的模式作为沙盒来玩。


-1 最好给开发人员单独的整个数据库副本,以便在他们自己的机器上使用。否则,他们只能安全地更改其架构中的内容。由于其他答案描述的其他原因,它使升级变得复杂,并且也使模式分离复杂化。
我不能代表您正在开发的应用程序......但是您的开发应该尽可能地反映生产。在 dev 中而不是 prod 中拥有模式可能会出现问题。
H
Herman Van Der Blom

这是使用 SQL Server 架构的一个很好的实现示例。我们有几个 ms-access 应用程序。我们希望将它们转换为 ASP.NET 应用程序门户。每个 ms-access 应用程序都被编写为该门户的应用程序。每个 ms-access 应用程序都有自己的数据库表。其中一些是相关的,我们将它们放在 SQL Server 的公共 dbo 模式中。其余的都有自己的模式。这样,如果我们想知道哪些表属于 ASP.NET 应用程序门户上的某个应用程序,可以轻松导航、可视化和维护。