【发布时间】:2021-03-25 03:15:37
【问题描述】:
我正在处理具有多个数据库架构的单个数据库,
例如
[Baz].[Table3],
[Foo].[Table1],
[Foo].[Table2]
我想知道为什么除了组织和权限之外,表还以这种方式分开。
这种情况有多普遍,还有其他好处吗?
【问题讨论】:
标签: sql-server
我正在处理具有多个数据库架构的单个数据库,
例如
[Baz].[Table3],
[Foo].[Table1],
[Foo].[Table2]
我想知道为什么除了组织和权限之外,表还以这种方式分开。
这种情况有多普遍,还有其他好处吗?
【问题讨论】:
标签: sql-server
在逻辑上将对象分组在一起并允许在架构级别设置权限方面,您具有主要优势。
它确实在编程中提供了更多的复杂性,因为您必须始终知道您打算从哪个模式获取某些东西 - 或者依赖用户的默认模式才能正确。同样,您可以使用它来允许在不同架构中使用相同的对象名称,以便代码只针对一个对象写入,而用户默认使用的架构决定哪个是。
我不会说这很常见,有趣的是大多数人仍然将所有内容都丢弃在 dbo 架构中。
【讨论】:
除了组织和权限之外,我不知道任何其他可能的原因。这些还不够好吗? :)
为了记录 - 我总是使用单一模式 - 但是我正在创建 Web 应用程序并且也只有一个用户。
10 年后更新!
其实还有一个原因。您可以出于不同目的拥有架构的“副本”。例如,假设您正在创建一个博客平台。人们可以注册并创建自己的博客。每个博客都需要一个用于帖子、标签、图像、设置等的表格。一种方法是添加一列
blog_id 到每个表并使用它来区分博客。或者......您可以为每个博客创建一个新架构并为每个博客创建新表。这有几个好处:
where blog_id=@currentBlog。当然也有缺点。
总而言之,这是一个非常小众的用例,但它可以很方便!
【讨论】:
对我来说,它们会导致更多问题,因为它们破坏了ownership chaining。
例子:
存储过程tom.uspFoo 很容易使用表tom.bar,但在dick.AnotherTable 上需要额外的权限。这意味着我必须将dick.AnotherTable 上的选择权限授予tom.uspFoo 的调用者...这会公开直接表访问。
除非我完全错过了什么......
我问了一个关于这个的问题:SQL Server: How to permission schemas?
关键是“同一所有者”:因此,如果 dbo 同时拥有 dick 和 tom 架构,则所有权链接确实适用。我之前的回答错了。
【讨论】:
这样做有好处的原因有几个:
在多个(实例)之间共享数据 的)应用程序。这可能是 如果您有参考组 之间共享的数据 应用程序和一组数据 这是特定于实例的。注意不要在不同模式中的实体之间进行循环引用。这意味着没有从架构 1 中的实体到架构 2 中的另一个实体的外键,并且在其他实体中没有从架构 2 到架构 1 的另一个外键。
数据分区:允许将数据存储在不同的服务器上 更容易。
【讨论】: