当前位置: 首页 > 面试题库 >

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

艾善
2023-03-14
问题内容

我有一个关于桌子设计的问题。我有一个应该认为可行的解决方案,但是没有。

考虑具有两个实体“ Subject”和“
Process”,它们都具有某些属性。每个“主题”可以与多个“进程”相关联。根据选择哪个“过程”,存在不同数量的实体“过程属性”。换句话说,当用户将“过程”与“主题”相关联时,他应该只能编辑专门链接到该“过程”的“属性”。

最终,我希望用户能够执行3件事:

  1. 创建新的“流程”并指定与其关联的“属性”
  2. 列出某个“主题”的所有“过程”,即使没有“属性”链接到该“主题”
  3. 将“过程”与“主题”相关联,并且仅允许评估预定义的“属性”

因此,表设计应类似于:

  • tblSubject = {SubjectID,…}
  • tblProcess = {ProcessID,…}
  • tblProcessProperty = {PropertyID,…}
  • tblRelationProcessProperty = {RelationProcessPropertyID,ProcessID,PropertyID}
  • tblRelationSubjectProcessProperty = {RelationID,RelationProcessPropertyID,SubjectID,PropertyValue}

只要有一个与每个“过程”相关联的“属性”,这显然就可以工作。因此,我的错误是不直接将“主题”链接到“过程”,但是我无法直接进行表格设计。

任何帮助表示赞赏。


问题答案:

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



 类似资料:
  • 问题内容: 我正在建立一个网站,其中包含不同类型的项目,例如博客,帖子,文章等。用户可以将其中任何一个设置为他/她的最爱。现在,当我处理这个问题时,我有两个选择 为每种对象的用户收藏夹创建一个表。 为所有用户的所有类型的对象创建一个公用表。 第一种结构的问题是,我将不得不查询很多表以显示特定用户的收藏夹。但这将使我可以轻松地将收藏夹分为不同的类别。 但是,如果我必须在一个页面上显示所有收藏夹并将它

  • 我正在处理一个项目,它有多个进程,每个进程都有不同的数据项要处理。数据项(对于不同的进程)有不同的列(但对于相同的进程总是相同的列)。 一开始,我假设为所有流程创建一个表是很好的,然后,每当创建一个新流程时,也可以创建另一个包含项目数据的表,但事实证明,将会有一种新的流程方法来经常创建新的表。然后我研究了嵌套表,但发现MySQL中没有嵌套表的概念。(我听说这可以用MariaDB完成,有人用过吗?)

  • 问题内容: 我试图弄清楚如何使用docker-compose.yml和2个从sql dump导入的数据库来实现docker。 以上返回以下内容: 基本上,我试图在单个docker compose文件中获取整个堆栈设置,创建2个数据库并导入相应的sql转储。有人有什么建议吗? 问题答案: 就像其他可能对此有所了解的人的更新一样。 我通过删除解决了这个问题: 从 docker-compose.yml中

  • 在阅读AWS DynamoDB留档时,我看到它不建议创建多个表。但是当我们将json格式化的数据放在DynamoDB表中时,应该是创建具有许多级别(例如10)的嵌套json内容的属性还是具有较少级别的多个属性?我想这是逐案处理的。但我想知道的是设计DynamoDB表时的一般规则。阅读AWS文档后,我仍然感到困惑,所以我在这里发布问题。谢谢!

  • 问题内容: 我了解简单列表理解的工作原理,例如: 而且我也了解嵌套列表的综合工作原理: 所以,当我尝试这样做 我期望这样: 但是我得到了: 所以我有更好的方法解决问题,这给了我我想要的 但是我不明白在第一个代码中返回9个元素 问题答案: 它有9个数字的原因是因为python对待 类似于 即,它是一个嵌套循环

  • 这是我第一次尝试将更复杂的对象存储到数据库中。我需要一些关于数据库设计的帮助。 要存储并从数据库中重新生成的recipe对象 最复杂的部分是对象。每个食谱可以有不同数量的步骤和不同的配料分配给每一个步骤。 我做了另一个设计,其中与以及与相结合。我认为第一种布局更容易查询,因为我只需查看就可以通过进行搜索,但我不确定。有什么想法吗?