2

我有三个非规范化表,我必须从表面上看(数据来自一些外部资源)。这三个表有不同的定义,但它们各自从不同的角度描述了同一个对象。

   object1  A  B
   object2  A
   object3     B  C
   object4        C

这些表之间唯一的共同点是它们的主键。我可以使用 SELECT UNION SELECT 将 ID 聚集在一起,但查询似乎相对较慢,即使每个表都有其 PK 字段索引。我可以创建一个视图来抽象这个查询 vw_object_ids,但它以相同的速度执行。我想我可以添加一个索引来实现视图,但是在 SQL Server 2005 中,您不能使用 UNION 来索引视图。

我想要的是让 ID 的主索引与基础数据同步,这些数据可能随时更新或删除。我想我可以通过一组疯狂的触发器无限期地完成此任务,或者只是满足于未索引视图的速度。但我只是想确保我没有遗漏任何选项,或者这个场景是否有名称或是否表明了一种模式。

想法?

4

2 回答 2

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的 to并在违反时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并删除所有三个表中的记录(如果有)。

于 2009-04-01T17:58:51.893 回答
0

为什么不直接进行外部连接,然后合并组件表中的列呢?

于 2009-04-01T17:56:39.043 回答