首先,对不起我的写作方式,这里的英语不好。
请考虑以下情况:
我使我的数据库架构结合了这样的视图:
- 实体
City
具有列 {city_id, city_name, state_name, ...
} - 实体
User
具有列 {user_id, user_name, user_login, city_id, ...
}
每个实体都有一个视图,该city
视图没有任何其他实体的 FK,所以它是一个简单的选择。
User
实体对实体有一个 FK city
,因此它与city
视图中的实体进行连接。
如下例:
create view vw_user as
select user.user_id,
user.user_name,
user.user_login,
vw_city.*
from user (nolock)
inner join vw_city (nolock) on vw_city.city_id = user.city_id
go
因此,如果您有一个像 user_access 这样的实体,并且对用户有一个 FK,那么 的视图user_access
将具有到 的内部连接vw_user
,并且它将显示来自user
和city
实体的所有列。
最后,我只是对视图进行查询,它会返回包含所有外部引用的完整实体。
这很好用,并且使维护过程变得非常容易,如果需要对其中一个实体进行任何更改,我有一个存储过程可以重新编译所有视图。
但是,它有一个问题,我在一个非常糟糕的情况下发现了这个,使用这种架构的系统已经运行得非常快速和流畅,例如我需要加入两个共享实体城市的实体,所以它会生成一个列冲突,SQL Server 不允许在视图中这样做,您可以毫无问题地执行冲突查询,但不能在视图中执行此操作。
所以,这是我的问题,我需要找到解决这个问题的方法,但我自己找不到答案。
我最终做的唯一一件事就是制作一个硬编码的视图,并重命名了列。
但我想要一个针对整个架构的解决方案,是永久性的,比如升级。
代码中遵循此体系结构,使用 C#,因此依赖于列名。
当我从查询中读取数据时,我需要从列名中获取数据,因此此代码可以与其他类重用,在 c# 代码中执行与视图在查询中所做的相同的事情。
因此,用序数获取数据是不可能的。
有任何想法吗?
谢谢,对不起,但这很难描述。