使用同义词和视图有哪些优缺点?

40

这是一个通用的数据库设计问题 - 在数据库开发中,使用同义词相对于简单视图的好处是什么?在选择两者之间时应该考虑哪些主要因素?

一个示例视图

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

并且等价的同义词:

CREATE SYNONYM Users 
FOR IdentitySystem.dbo.LCTs
8个回答

45
它们是不同的事物。同义词是直接对象的别名,视图是一个或多个表构建的结构。
使用视图的一些原因:
- 可能需要过滤、连接或以其他方式处理结果集的结构和语义。 - 可能需要为已更改但具有您不想重新处理的依赖项的基础结构提供遗留支持。 - 可能会提供安全性,其中表的某些内容应该对某类用户可见,但不是全部。这可能涉及删除具有敏感信息的列或过滤出子集记录。 - 可能希望在可供报告目的访问的形式中封装一些业务逻辑。 - 您可能希望统一来自多个来源的数据。
...还有很多其他原因。
使用同义词的原因:
- 您可能希望为另一个数据库中的对象设置别名,在那里您无法(或不想)硬编码到特定数据库的引用。 - 您可能希望重定向到随时间变化的源,例如存档表。 - 您希望以不影响查询优化器的方式为别名设置某些内容。
...还有很多其他原因。

1
抱歉打扰了一个旧的帖子,但我有一个类似的困境,不知道是使用视图还是同义词。那是一个很好的答案,谢谢,但它并没有真正回答问题。 - DarthPablo
1
抱歉打扰了一个旧的帖子,但我有一个类似的困境,不知道是使用视图还是同义词。谢谢你的好解释。我的问题是是否有任何理由不使用“直接”视图来执行“select * from table”?这是你提到的与查询优化器有关的部分吗?我发现同义词的一个问题是当使用hibernate.hbm2ddl.auto=validate开启模式验证时,它会导致Hibernate出现问题。关于使用同义词的原因,您提到的前两个理由肯定可以通过视图来解决,不是吗? - DarthPablo
使用同义词的三个原因中,前两个同样适用于邻近视图(create view X_table as select * from another_database.dbo.X_table)。至于第三个原因——99%的情况下可能没有任何惩罚。那么神秘的 ...Plus many more. 是什么?它们重要吗?@Jimmy Zimms 给出了一个好答案。 - Konstantin

10

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

通过视图,我可以:

  • 隐藏列
  • 增加谓词(WHERE子句)以限制行
  • 重命名列
  • 将列名称赋给SQL表达式

通过同义词,我可以:

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

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

希望对您有所帮助。


4

我使用同义词来分享其他数据库中的对象,这样当我使用 .Net Entity Framework 时,我可以使用一个 ObjectContext 来访问许多数据库中所需的所有数据。


你能提供一些关于你如何完成这个任务的更多细节吗?这个答案提供了一种方式,但不太理想。https://dev59.com/HW025IYBdhLWcg3wYFCH - JoeBrockhaus

4

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

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

  • 它允许您在其他模式中使用表,而无需在表名中加上点(例如,user.tab_name可以替换为some_synonym_name)
  • 您不希望与他人共享实际对象

3
视图的列投影是在创建时建立的。因此,如果您向底层视图添加列,则在修改视图之前它不会被公开。但同义词则不同。将其视为tsql中简单的名称替换,通常用于隐藏复杂性。

1
我希望这篇文章能够帮助某些人,我看了一下这篇文章,找到了使用视图而不是同义词的原因。
当你使用Sql server作为数据库服务器和SAS作为客户端时,如果使用同义词,则在SAS库中将无法识别它。所以我不得不创建一个视图。
虽然不是最优化的,但至少Windows sas与Sql server也不是最佳组合 :)

1

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


1
对于 SQL Server,您可以授予 SYNONYM 对表的 SELECT、INSERT、UPDATE、DELETE 权限(对 SP 或 UDF 授予 EXEC 权限等)。 - tgolisch

0

我们最近移动了一些表并用同义词替换了它们。然后我们发现:

  • 当使用C#代码通过SqlBulkCopy插入数据时,同义词无法工作
  • 当使用4部分命名约定从链接服务器查询时(从servername.dbname.schemaname.synonymname选择*),同义词无法工作

在这些情况下,我们不得不改用视图。对于其他所有内容,我们仍然更喜欢同义词的简单性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接