1

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

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

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

  3. 可以构建许多 Presets,它们包含的 PresetItems 不同。

  4. PresetItems 可以在许多不同的 Preset 中重复使用,以构建不同的 Preset 配置。

其使用方式是动态创建报告。预设是报告的名称。PresetItems 是报告的各个部分。这些部分(PresetItem)就像报告的一部分,例如“Year to Date Graph”。此 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

... ETC ...

您会注意到一些 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

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

我确实明白它为什么会这样,但我现在不知道如何解决它。如果我对这一切都错了,请告诉我。

任何帮助表示赞赏。

谢谢。

4

2 回答 2

3

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

可能最简单的一种是将每种“类型”的连接拆分为单独的表:

在此处输入图像描述


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

于 2012-04-26T20:13:02.680 回答
0

我没有使用 SQL Server 的经验,所以我将这里的讨论限制在数据库设计上。

在我看来,这就是你需要去的地方:

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

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

像这样的东西:

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

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

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

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

多对多自引用表

于 2012-04-26T19:49:42.463 回答