亲子关系中有很多人

时间:2012-04-26 19:35:35

标签: database-design many-to-many parent-child

我正在尝试在SQL Server 2008中构建父子关系,但我无法让它工作。

  1. 有预设(根级节点),然后有PresetItems(子节点)。

  2. Preset只能包含PresetItems,但PresetItems可以包含其他PresetItems作为子节点。

  3. 可以构建许多预设,这些预设在它们包含的PresetItem中有所不同。

  4. 可以在许多不同的预设中重复使用PresetItem来构建不同的预设配置。

  5. 使用它的方法是动态创建报告。预设是报告的名称。 PresetItems是报告的各个部分。这些部分(PresetItem)就像报告的一部分,例如“年初至今图”。此PresetItem将包含文本说明,然后可以将包含该图形的另一个PresetItem添加为此PresetItem部分的子项。

    此过程一直持续到报告的所有部分都已组合完毕。

    以下是插图:

    Client "A" Report (Preset 1)
       -- Overview (PresetItem 1) - contains boilerplate and maybe some dynamic data
       -- YTD Report (PresetItem 2) - contains boilerplate
          -- YTD Graph (PresetItem 3) - contains a graph created dynamically from SQL Server data
       -- Core References (PresetItem 4) - contains a table of dynamic data
       -- Summary (PresetItem 5) - contains boilerplate
    
    Client "B" Report (Preset 2)
       -- Overview (PresetItem 1) - contains boilerplate and maybe some dynamic data
       -- Monthly Balance Sheet (PresetItem 8) - contains dynamic data
       -- YTD Report (PresetItem 2) - contains boilerplate
          -- YTD Graph (PresetItem 3) - contains a graph created dynamically from SQL Server data
       -- Summary (PresetItem 5) - contains boilerplate
    

    ...等......

    您会注意到一些PresetItem可以组合成许多不同的报告或预设。

    这是我构建数据库表的方式,我无法创建父子关系,因为多对多表中有两个主键。

    Preset Table
    -- Id (key)
    -- Name
    
    PresetItem Table
    -- Id (key)
    -- Name
    -- Description
    -- DataResource
    -- (other columns)
    
    PresetPresetItem (many-to-many table)
    -- PresetId (key)
    -- PresetItemId (key)
    -- ParentId
    -- SortOrder
    

    我是否在正确的轨道上获得我正在寻找的结果?我无法在PresetItemId和ParentId之间的PresetPresetItem表中创建父子关系,因为它抱怨我遗漏了另一个主键(PresetId)。

    我明白为什么会这样做,我现在无法弄清楚如何修复它。如果我发现这一切都错了,请告诉我。

    感谢任何帮助。

    感谢。

2 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题。

最简单的一种方法是将每种“种类”的连接分成单独的表:

enter image description here


或者,您也可以考虑从公用表继承PresetItem,然后在 表的顶部实现图形边缘。这可能过于灵活,无法满足您的需求:Preset可能是另一个Preset甚至Item的孩子,这可能不是您想要的。

答案 1 :(得分:0)

我没有SQL服务器的经验,因此我将此讨论限制在数据库设计中。

听起来我觉得这就是你需要去的地方:

如果PresetItems可以严格分层的方式引用自己的 ,则不需要第三个表。在这种情况下,只需给PresetItems一个外键回复自己。如果情况并非如此,我将不得不考虑如何实现多对多的关系。

但是,如果这个假设是错误的,那么你可能正走在正确的轨道上!

这样的事情:

Presets
-------
presetId (PK)

PresetItems
-----------
presetItemId (PK)
presetIdFk (FK to Presets)
presetItemIdFk (FK to PresetItems (self))

这允许一个Preset到许多PresetItems,PresetItems将被组织为一个树。

如果PresetItems不代表分层数据,你应该这样做:

Many-to-many self-referential table