具有索引视图的sqleav结构
我正在开发一个通用的文档工作流系统,每个文档都有不同的属性,但它们共享相同的大纲,并且执行相同的工作流 因此,我没有为每种新的文档类型创建一个表,在经过一些研究和斗争后,我决定对文档属性使用EAV结构,我知道它们的缺点,但我认为我没有其他方便的方法来实现这一点,我是我 无论如何,我使用了EAV结构的codeplax示例,它们在数据库中为每个EAV“对象”装箱一个视图,可以作为普通表轻松查询 我决定更进一步,为视图编制索引,以便获得性能,问题如下:具有索引视图的sqleav结构,sql,sql-server,indexing,entity-attribute-value,sql-view,Sql,Sql Server,Indexing,Entity Attribute Value,Sql View,我正在开发一个通用的文档工作流系统,每个文档都有不同的属性,但它们共享相同的大纲,并且执行相同的工作流 因此,我没有为每种新的文档类型创建一个表,在经过一些研究和斗争后,我决定对文档属性使用EAV结构,我知道它们的缺点,但我认为我没有其他方便的方法来实现这一点,我是我 无论如何,我使用了EAV结构的codeplax示例,它们在数据库中为每个EAV“对象”装箱一个视图,可以作为普通表轻松查询 我决定更进一步,为视图编制索引,以便获得性能,问题如下: 方案绑定:通过 左连接:通过 最小聚合函数:无
- 方案绑定:通过
- 左连接:通过
- 最小聚合函数:无法通过李>
CREATE VIEW [dbo].[vComputer1]
WITH SCHEMABINDING
AS
SELECT
O.ObjectID, MIN(O.Name) AS Name,
MIN(CASE WHEN V.AttributeID = 4 THEN V.Value ELSE NULL END) AS Make,
MIN(CASE WHEN V.AttributeID = 5 THEN V.Value ELSE NULL END) AS Model,
MIN(CASE WHEN V.AttributeID = 6 THEN V.Value ELSE NULL END) AS Type,
MIN(CASE WHEN V.AttributeID = 7 THEN V.Value ELSE NULL END) AS CPU,
MIN(CASE WHEN V.AttributeID = 8 THEN V.Value ELSE NULL END) AS Drive,
MIN(CASE WHEN V.AttributeID = 9 THEN V.Value ELSE NULL END) AS Video,
MIN(CONVERT(INT, CASE WHEN V.AttributeID = 10 THEN V.Value ELSE NULL END)) AS RAM,
MIN(CASE WHEN V.AttributeID = 11 THEN V.Value ELSE NULL END) AS Optical,
MIN(CASE WHEN V.AttributeID = 12 THEN V.Value ELSE NULL END) AS Battery,
MIN(CASE WHEN V.AttributeID = 13 THEN V.Value ELSE NULL END) AS Screen,
MIN(CASE WHEN V.AttributeID = 14 THEN V.Value ELSE NULL END) AS OS,
MIN(CASE WHEN V.AttributeID = 15 THEN V.Value ELSE NULL END) AS PurchaseDate
FROM dbo.Object AS O INNER JOIN
dbo.Value AS V ON ISNULL(V.ObjectID, 1) = O.ObjectID INNER JOIN
dbo.Category AS C ON ISNULL(C.CategoryID, 2) = O.CategoryID
WHERE (C.Name = 'Computer')
GROUP BY O.ObjectID
你需要做的第一件事就是阅读。在您选择的路径中有许多陷阱
对于索引视图,限制记录在,其中非常明确地禁止
MIN
和MAX
。在中解释的原因是,您是否考虑过使用大多数文档类型的单个文档表?除非每个文档类型都与一组与所有其他文档类型截然不同的属性相关联,否则这可能是一个比EAV更好的解决方案。是的,我有一个包含共享属性的主表,但我们正在为每个文档类型添加新的文档类型,所以我决定使用动态!我明白了,有很多东西我会在路上绊倒,但我还没有放弃,我会给它一个机会:)P