我遇到了以下表格设计,用于以非规范化方式记录引用:
RecordGUID uniqueidentifier
DestinationEntity uniqueidentifier
DestinationRecordGUID uniqueidentifier
例如,Users
对于描述对 的引用的表Countries
,我们将有:
RecordGUID DestinationEntity DestinationRecordGUID
79282C80-4474-4617-9C40-C21E97F5AC52 3A462EF8-DAB6-4B98-BA1B-FBD957A1737C 5842E524-8C5D-4DEE-A553-0857FB9C12F4
B25DA064-8DAF-4EEB-8894-D540B3A929EA 3A462EF8-DAB6-4B98-BA1B-FBD957A1737C C2B0AA1A-E688-4E2C-BD5F-16309C496774
因此,3A462EF8-DAB6-4B98-BA1B-FBD957A1737C
表示Countries
、 while5842E524-8C5D-4DEE-A553-0857FB9C12F4
和C2B0AA1A-E688-4E2C-BD5F-16309C496774
是指Counries
表中的记录。
我们在这里有很多关系 - 例如,users
to languages
,companies
等。并且因为使用GUID
以加入表不是用户友好的,我们为每个关系建立了索引视图,如下所示:
CREATE VIEW [dbo].[users_countries]
WITH SCHEMABINDING
AS
SELECT [RecordGUID]
,[DestinationEntity]
,[DestinationRecordGUID]
FROM (the relationship table)
WHERE [DestinationEntity] = '3A462EF8-DAB6-4B98-BA1B-FBD957A1737C';
因此,人们可以轻松地将此视图连接到counties
表并对其进行查询 - 此外,由于使用视图(没有展开)并在其上有索引,并非原始表中的所有记录都被读取(它更快)。
系统可能有数百个索引视图,与原始表上的过滤索引相比,我担心引擎管理它们的成本。我的意思是view
只创建这样的索引:
CREATE INDEX (index_Name) ON (the relationship table)
(
[RecordGUID]
,[DestinationRecordGUID]
)
WHERE [DestinationEntity] = '3A462EF8-DAB6-4B98-BA1B-FBD957A1737C'
我们不再能够以友好的方式查询该表,但这会影响性能吗?
我找不到任何关于索引视图损害性能的话题——但面对这样的设计让我怀疑。
我想知道我们可以说视图索引的维护和表上的相同索引(如上)是相同的吗?
这设计太可怕了。您应该有单独的表和真正的外键。要快速修复,请使用索引视图。如果存在性能问题,请修复设计。