在我看来,就像您尝试实施一种EAV(实体属性值)设计一样。
您的表似乎还可以,但是这种设计固有地需要复杂的SQL。
有不同的方法可以执行此操作,但是根据您上面的故事,我会选择类似的方法。
Subject --< Process --< RelationshipProcessProperty >-- Property
您的媒体资源看起来像这样:
"Property" PK PropertyId Name
您的RelationshipProcessProperty可能如下所示:
"RelationshiipProcessProperty" PK RelationshipProcessProperty FK Process FK Property Value
您的SQL会变得很复杂。当您要在同一张表中查找多个值时,进行这样的“通用”设计是有隐含的。
; with Property1 as( SELECt proc.Id as ProcessId, prop.Name, rrp.Value FROM Subject s LEFT JOIN Process proc ON s.SubjectId = proc.SubjectId LEFT JOIN RelationshipProcessProperty rpp on proc.ProcessId = rpp.ProcessId LEFT JOIN Property prop on rpp.PropertyId = prop.PropertyId WHERe s.Name = "Subject1" AND proc.Name = "Process1" AND prop.Name = "Property1" ) , Property2 as( SELECt proc.Id as ProcessId, prop.Name, rrp.Value FROM Subject s LEFT JOIN Process proc ON s.SubjectId = proc.SubjectId LEFT JOIN RelationshipProcessProperty rpp on proc.ProcessId = rpp.ProcessId LEFT JOIN Property prop on rpp.PropertyId = prop.PropertyId WHERe s.Name = "Subject1" AND proc.Name = "Process1" AND prop.Name = "Property2" ) SELECt p1.Name, p1.Value, p2.Name, p2.Value FROM Property1 p1 LEFT JOIN Property2 p2 on p1.ProcessId = p2.ProcessId
您可以使用此方法为同一过程获取多个属性。
为了具有指定流程的指定属性,您需要创建“流程类型表”:
"ProcessType" PK ProcessType Type
这确实意味着您将需要在过程表中添加一个外键,以将其链接到它的类型。然后,您可以使用定义所有可用类型的关系表将ProcessType表链接到Property表。
"EligibleProcessProperties" PK EligibleprocessPropertiesId FK ProcessType Fk Property
然后要找出该流程类型的所有可用属性,您将有一个相对简单的查询
SELECt p.Name FROM ProcessType pt LEFT JOIN EligibleProcessProperties epp on pt.ProcessTypeId = epp.ProcessTypeId LEFT JOIN Property p on epp.PropertyId = p.PropertyId WHERe pt.Type = "Type1"
我 认为
这是您正在寻找的东西(尽管我可能会完全不在家)。如果这是您要寻找的内容,那么这里有一篇非常好的文章,提出了一些要点。
另外,我几乎100%都有更好的方法来执行长时间的“; with”查询-但这就是我所知道的。希望其他人可以提供更好的服务。关键是,使用这种设计,您 将
需要一种或另一种方式的子查询。



