Access迁移至SSMS:同RDB表经中间表双实例关联的实现问题
解决SSMS中自关联表的关系图展示问题
完全不需要创建T-Organisation的物理副本,用表别名就能完美解决,不管是写查询SQL还是在SSMS关系图里展示关联都适用,这也是符合数据库设计规范的最优方案。
一、SQL查询里的实现
和你Access生成的逻辑一致,只是可以用更易懂的别名代替自动生成的T-Organisation_1,比如用ParentOrg代表父组织,SubsidiaryOrg代表子组织,可读性更强:
SELECT ParentOrg.[Organisation Unit Id] AS ParentOrgId, ParentOrg.[Organisation UnitName] AS ParentOrgName, SubsidiaryOrg.[Organisation Unit Id] AS SubsidiaryOrgId, SubsidiaryOrg.[Organisation UnitName] AS SubsidiaryOrgName FROM [T-Organisation] AS ParentOrg INNER JOIN [T-OrganisationSubsidiary] ON ParentOrg.[Organisation Unit Id] = [T-OrganisationSubsidiary].[Parent Organisation Unit] INNER JOIN [T-Organisation] AS SubsidiaryOrg ON [T-OrganisationSubsidiary].[Subsidiary Organisation Unit] = SubsidiaryOrg.[Organisation Unit Id];
二、SSMS关系图里的操作步骤
SSMS其实支持添加同一个表的多个实例,只是操作和Access不一样,步骤如下:
- 打开数据库关系图,右键空白处选「添加表」;
- 找到
T-Organisation双击添加第一次; - 再找到
T-Organisation双击添加第二次,SSMS会自动给第二个实例命名为T-Organisation_1; - 接下来建立关联:
- 把
T-Organisation的Organisation Unit Id拖到T-OrganisationSubsidiary的Parent Organisation Unit字段; - 把
T-Organisation_1的Organisation Unit Id拖到T-OrganisationSubsidiary的Subsidiary Organisation Unit字段;
- 把
- 要是觉得默认别名不好懂,右键关系图里的表实例,选「属性」,在「别名」栏改成
ParentOrg这类有意义的名字就行。
别创建物理副本的原因
- 纯纯浪费存储空间,同一个数据存两份完全没必要;
- 维护起来麻烦,更新父表时还得同步副本,很容易出现数据不一致;
- 违反数据库规范化设计原则,冗余数据会引发一堆后续问题。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

