我正在尝试在SQL Server 2008中构建父子关系,但我无法让它工作。
有预设(根级节点),然后有PresetItems(子节点)。
Preset只能包含PresetItems,但PresetItems可以包含其他PresetItems作为子节点。
可以构建许多预设,这些预设在它们包含的PresetItem中有所不同。
可以在许多不同的预设中重复使用PresetItem来构建不同的预设配置。
使用它的方法是动态创建报告。预设是报告的名称。 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)。
我明白为什么会这样做,我现在无法弄清楚如何修复它。如果我发现这一切都错了,请告诉我。
感谢任何帮助。
感谢。
答案 0 :(得分:3)
有几种方法可以解决这个问题。
最简单的一种方法是将每种“种类”的连接分成单独的表:
或者,您也可以考虑从公用表继承Preset
和Item
,然后在 表的顶部实现图形边缘。这可能过于灵活,无法满足您的需求: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不代表分层数据,你应该这样做: