我有三个非规范化表,我必须采用面值(数据来自某些外部资源)。这三个表有不同的定义,但它们各自从不同的角度描述相同的对象。
object1 A B
object2 A
object3 B C
object4 C
这些表之间唯一的共同点是它们的主键。我可以使用SELECT UNION SELECT将ID集中在一起,但查询似乎相对较慢,即使每个表的PK字段都已编入索引。我可以创建一个视图来抽象这个查询,vw_object_ids,但它以相同的速度执行。我以为我可以添加索引来实现视图,但在SQL Server 2005中,您无法使用UNION索引视图。
我想要的是让ID的主索引与基础数据同步,这些数据可能会随时更新或删除。我想我可以通过一组疯狂的触发器无限期地完成这个任务,或者只是满足于无索引视图的速度。但我只是想确保我没有错过任何选项,或者这个场景是否有名称或是指示模式。
思想?
答案 0 :(得分:2)
创建仅包含ID的主表:
CREATE TABLE master (ID INT NOT NULL PRIMARY KEY)
并使所有三个表都使用ON DELETE CASCADE
引用该主表。
首次填充表格,发出
INSERT
INTO master
SELECT id
FROM a
UNION
SELECT id
FROM b
UNION
SELECT id
FROM c
要定期填充表格,请在三个表格中的每一个表格上创建一个触发器。
此触发器应尝试将新ID
插入master
,并在PRIMARY KEY
违规时默默无效。
要查询,请使用:
SELECT *
FROM master m
LEFT OUTER JOIN
a
ON a.id = m.id
LEFT OUTER JOIN
b
ON b.id = m.id
LEFT OUTER JOIN
c
ON c.id = m.id
这将使用有效的索引。
要删除,请使用:
DELETE
FROM master
WHERE id = @id
这将触发ON DELETE CASCADE
并删除所有三个表中的记录(如果有)。
答案 1 :(得分:0)
为什么不直接进行外连接,然后合并组件表中的列?