栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有多个嵌套表的数据库设计

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有多个嵌套表的数据库设计

在我看来,就像您尝试实施一种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”查询-但这就是我所知道的。希望其他人可以提供更好的服务。关键是,使用这种设计,您
需要一种或另一种方式的子查询。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634882.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号