2012-04-26 140 views
1

我想在SQL Server 2008中构建一个父子关系,并且无法使它工作。许多到很多的亲子关系

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

  2. 预设只能包含PresetItems,但PresetItems可以包含其他PresetItems子节点。

  3. 许多预设可以内置在它们所包含的PresetItems变化。

  4. 的PresetItems可以以许多不同的预置被重用以构建不同预置配置。

这是用来动态创建报告。预设是报告的名称。 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 

...等...

你会发现,一些PresetItems能组装成许多不同的报告或预设。

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

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

我与SQL服务器没有经验,所以我在这里限制我的讨论数据库设计。

这听起来好像这是你需要去:

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

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

事情是这样的:

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

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

这样一个预设了许多PresetItems,并PresetItems将组织成一棵树。

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

Many-to-many self-referential table

+0

感谢您的建议。我会试一试,看看会发生什么。顺便说一句,我正在使用SQL Server 2008. – Kahanu 2012-04-26 20:43:03

+0

实际上再次考虑你的建议似乎不会在这种情况下工作。您的建议将使预设只包含一个PresetItem,并且它需要包含任意数量的预设项目。我创建了一些临时表,并且我无法创建一个SQL语句来返回我需要的结果。 – Kahanu 2012-04-26 21:08:28

+0

啊哈。修改答案。 – 2012-04-26 21:09:56

3

有两种方法来解决这个问题。

也许最简单的一种是分割每个连接到不同的表的“厚道”:

enter image description here


或者,你也可以考虑沿用普通表PresetItem然后在表上执行图边缘表。这可能对你的需求太灵活了,但是:Preset可能是另一个Preset甚至Item的孩子,这可能不是你想要的。

+0

这几乎就是我想的。这很好,因为“项目”需要独立于预设,但预设不能是其他预设的子项目。我想我需要再调查一下。感谢您的建议。 – Kahanu 2012-04-26 21:31:33