【问题标题】:What are the pros/cons of using a synonym vs. a view?使用同义词与视图的优缺点是什么?
【发布时间】:2009-05-15 14:35:19
【问题描述】:

这是一个通用的数据库设计问题 - 在数据库开发中使用同义词比简单视图有什么好处?在两者之间进行选择时要牢记哪些主要考虑因素?

一个示例视图

CREATE VIEW Users AS
SELECT * FROM IdentitySystem.dbo.Users

以及等价的同义词:

CREATE SYNONYM Users 
FOR IdentitySystem.dbo.LCTs

【问题讨论】:

    标签: sql database database-design


    【解决方案1】:

    它们是不同的东西。同义词直接是对象的别名,视图是一个或多个表的构造。

    使用视图的一些原因:

    • 可能需要过滤、连接或以其他方式处理结果集的结构和语义

    • 可能需要为已更改但具有您不想重新工作的依赖项的底层结构提供旧版支持。

    • 可以提供安全性,其中表的某些内容应该对一类用户可见,但不是全部。这可能涉及删除包含敏感信息的列或过滤掉记录的子集。

    • 可能希望将一些业务逻辑封装在用户可访问的表单中以进行报告。

    • 您可能希望统一来自多个来源的数据。

    ...还有更多。

    使用同义词的原因:

    • 您可能希望为另一个数据库中的对象设置别名,而您不能(或不想)对特定数据库的引用进行硬编码。

    • 您可能希望重定向到随时间变化的源,例如存档表。

    • 您希望以不影响查询优化器的方式为某些内容设置别名。

    ...还有更多。

    【讨论】:

    • 很抱歉拖了一个旧线程,但我有一个类似的困境是使用视图还是同义词。这是一个很好的答案,谢谢,但它并不能真正回答问题
    • Take 2 :-C 很抱歉拖了一个旧线程,但对于是否使用视图或同义词,我有类似的困境。也谢谢你的好解释。我的问题是是否有任何理由使用“直接”视图执行“从表中选择 *”?您提到的那一点与查询优化器有关吗?我发现同义词的一个问题是,当使用hibernate.hbm2ddl.auto=validate 打开模式验证时,它们会导致 Hibernate 抱怨。关于你使用同义词的原因,前两个肯定可以用视图来解决,不是吗?
    • 在使用同义词的三个原因中,前两个同样适用于邻近视图 (create view X_table as select * from another_database.dbo.X_table) 至于第三个原因 - 99% 的情况下也可能没有任何惩罚。那么神秘的...Plus many more.是什么?它们重要吗? @Jimmy Zimms 给出了一个很好的答案
    【解决方案2】:

    有很多考虑因素。简而言之,使用最适合每种情况的工具。

    有了风景,我可以

    • 隐藏列
    • 添加谓词(WHERE 子句)来限制行
    • 重命名列
    • 为 SQL 表达式指定列名

    有了同义词,我可以:

    • 引用其他模式和数据库中的对象而不限定名称

    同义词可能还可以做更多事情。 在我们(Oracle 数据库)应用程序的设计中,我们为所有数据库对象(表、视图、触发器等)使用“所有者”模式(用户),并将这些对象的权限授予其他“应用程序”用户。在每个“应用”用户模式中,我们创建同义词来引用“所有者”对象。

    HTH

    【讨论】:

      【解决方案3】:

      视图主要是一个简单/复杂的“选择”语句。本质上,您将视图用作掩码,并且仅显示那些有用的列值。您使用视图的目的是不向最终用户显示额外信息。

      而同义词是数据库对象的替代名称。

      • 它允许你在其他模式中使用表而不用前缀模式 表名中带点的名称如(user.tab_name 可以替换为 some_synonym_name)
      • 您没有兴趣与他人分享实际对象,

      【讨论】:

        【解决方案4】:

        我使用同义词来共享来自其他数据库的对象,因此当我使用 .Net Entity Framework 时,我可以使用单个 ObjectContext 来访问来自多个数据库的所有必需数据。

        【讨论】:

        【解决方案5】:

        视图的列投影是在创建时建立的。因此,如果您将一列添加到基础视图,则在您更改视图之前它不会被公开。同义词并非如此。将其视为 tsql 中的简单名称替换,通常是为了隐藏复杂性。

        【讨论】:

          【解决方案6】:

          如果我错了,请纠正我,但我认为我看到了同义词的另一种用法(至少在 Progress OpenEdge 中),我在任何地方都没有看到记录,这可以使它比视图更安全。 DML SELECT 语句语法允许您使用表、视图或同义词,但 INSERT、UPDATE 和 DELETE 语句只允许表或视图。一些视图,如果它们满足某些标准,则提供对数据的可更新、可插入和可删除的访问。同义词似乎是提供对数据的只读访问权限的好方法,而不必在视图上授予(或拒绝)权限。

          【讨论】:

          • 对于 SQL Server,您可以将 SELECT、INSERT、UPDATE、DELETE 授予表的 SYNONYM。 (为 SP 或 UDF 等授予 EXEC)。
          【解决方案7】:

          我希望它可以对某人有所帮助,我查看了这篇文章并找到了使用视图而不是同义词的理由。

          当您使用 Sql server 作为 Db 服务器和 SAS 作为客户端时。如果您使用同义词,您的 SAS 库中将无法识别它。我必须创建一个视图。

          它没有优化,但至少带有 Sql server 的 Windows sas 也不是最好的:)

          【讨论】:

            猜你喜欢
            • 2010-12-03
            • 1970-01-01
            • 1970-01-01
            • 2016-05-23
            • 1970-01-01
            • 2017-07-26
            • 2016-03-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多