这是一个通用的数据库设计问题 - 在简单的视图中,在数据库开发中使用同义词有什么好处?在两者之间进行选择时要记住哪些主要考虑因素?
示例视图:
CREATE VIEW Users AS
SELECT * FROM IdentitySystem.dbo.Users
等同的同义词:
CREATE SYNONYM Users
FOR IdentitySystem.dbo.LCTs
答案 0 :(得分:38)
他们是不同的东西。同义词是对象的别名,视图是一个或多个表的构造。
使用视图的一些原因:
可能需要使用结果集的结构和语义进行过滤,连接或其他方式
可能需要为已更改但具有您不想重新工作的依赖项的基础结构提供遗留支持。
可以提供安全性,其中表的某些内容应该对一类用户可见,但不是全部。这可能涉及删除包含敏感信息的列或过滤掉记录的子集。
可能希望将某些业务逻辑封装在用户可以访问的表单中以进行报告。
您可能希望统一来自多个来源的数据。
......还有更多。
使用同义词的原因:
您可能希望在另一个数据库中为对象添加别名,您无法(或不希望)对特定数据库的引用进行硬编码。
您可能希望重定向到随时间变化的来源,例如存档表。
您希望以不影响查询优化器的方式对别名进行别名。
......还有更多。
答案 1 :(得分:6)
有很多考虑因素。简而言之,使用最适合每种情况的工具。
有了观点,我可以
用同义词,我可以:
可能有更多可以通过同义词来完成。 在我们(Oracle数据库)应用程序的设计中,我们对所有数据库对象(表,视图,触发器等)使用“所有者”模式(用户),并且我们将这些对象的权限授予其他“app”用户。在每个“app”用户模式中,我们创建同义词以引用“所有者”对象。
HTH
答案 2 :(得分:3)
视图主要是一个简单/复杂的“select”语句。基本上,您使用视图作为掩码,并仅显示那些有用的列值。您使用的视图的目的是不向最终用户显示额外信息。
而同义词是数据库对象的替代名称。
答案 3 :(得分:3)
我使用同义词来共享来自其他数据库的对象,这样当我使用.Net Entity Framework时,我可以使用单个ObjectContext来访问来自许多数据库的所有必需数据。
答案 4 :(得分:3)
视图中的列投影是在创建时建立的。因此,如果向基础视图添加列,则在更改视图之前不会公开该列。用同义词不是这样。可以把它想象成你的tsql中的简单名称替换,通常是为了隐藏复杂性。
答案 5 :(得分:1)
如果我错了,请纠正我,但我认为我看到了同义词的另一种用法(至少在Progress OpenEdge中),我没有在任何地方看到记录,这可以使它比视图更安全。 DML SELECT语句语法允许您使用表,视图或同义词,但INSERT,UPDATE和DELETE语句仅允许表或视图。某些视图(如果满足特定条件)提供对数据的可更新,可插入和可删除的访问。同义词似乎是提供对数据的只读访问的好方法,而不必混淆授予(或拒绝)视图权限。
答案 6 :(得分:1)
我希望它可以帮助某人,我看了一下这篇文章,我找到了使用View而不是同义词的理由。
当您使用Sql服务器作为Db服务器和SAS作为客户端时。如果您使用同义词,则无法在SAS库中识别。我不得不创建一个视图。
它没有经过优化,但至少Windows sas与Sql服务器并不是最好的:)