2010-08-04 75 views
1

我一直在试图找到答案,我不知道描述它的最佳方式。单桥表还是有更好的方法吗?

基本上,我有3个源表,每个都有uniqueidentifier键。我们将这些表格称为Skill1,Duty2,Custom3。除了它们是特定工作的属性之外,它们不以任何方式与对方相连(容易)。我想从现在的8个不同的表格(我将称之为Resource1 - Resource8)将这些技能与资源联系起来(例如:一本书,一个URL,一个课程ID)。这是为了允许将这些类型的资源的任何组合链接到包含在所述3个“技能表”中的任何属性。

我想出了很多奇怪的设计,但我在下面解决:

表 - 列 - > FK

Skill1 - SkillUniqueId -> BridgeTable.AttributeUniqueId 
Duty2 - DutyUniqueId -> BridgeTable.AttributeUniqueId 
Custom3 - CustomUniqueId -> BridgeTable.AttributeUniqueId 

BridgeTable - AttributeUniqueId, ResourceUniqueId, AttributeType, ResourceType 

Resource1 - ResourceUniqueId -> BridgeTable.ResourceUniqueId 
Resource2 - ResourceUniqueId -> BridgeTable.ResourceUniqueId 
Resource3 - ResourceUniqueId -> BridgeTable.ResourceUniqueId 
...etc. 

“问题”这个简单的设计是我有一个将3个“属性”表连接到8个资源表的桥接表,我必须在存储过程(以及可能的应用程序使用这些表)中使用AttributeType和ResourceType,以便利用正确的表。

有没有更好的方法将这3个属性表连接到资源而不需要复制其他地方已存在的数据? (即:用所有可能的属性组合来创建一个“工作”表,或将我的所有资源表拼凑成一个表,并包含大量可为空的列)

+0

为什么8个资源表?7我可以理解 - 技能,职责和习惯各为3,技能和职责,职责和自定义,技能和自定义各加3分,全部为1 3.什么是第8张桌子? – 2010-08-04 17:13:57

+0

我需要的一些资源是内部业务资源...我不认为我已经解释得很好,因为你能够捕捉到我正在做的事情。这些资源描述了培训资源(URL,书籍,内部培训代码,内部方法ID,LMS ID/URL等) – Andir 2010-08-04 17:33:29

回答

2

在第三种常规表单数据库中,根据您的描述你需要一个连接每个属性和每个可能的资源表的桥接表。任何类型的快捷方式(例如您提出的建议)都会导致问题(例如您发现的问题 - 有关此主题的优秀文章可以在SQL Server Central上找到,或者Google上的“MUCK表格”中找到。)

可在8资源表中的数据被修改为一个表,是这样的:

ResourceUniqueId 
ResourceType 
ResourceName 
ResourceEtc 

有可能是一个“类型”表来帮助定义/控制资源的类型?如果是这样,那么你只需要每个属性表的一个桥表。

或者,也许一组类型子类型表可以帮助 - 顶级资源表,当前表被配置为子类型。

如果失败,控制非规范化可能会有所帮助。创建合并所有资源的单个表,然后将每个资源中的数据复制到其中。当然,非规范化的代价是当资源更新时(如果不更新),你必须保持它们在多个地方同步,如果更新频繁,这可能是一个皇家噩梦。最终,如果您有复杂的数据,那么您将需要复杂的模型和代码来正确表示它。可以采取反规范化快捷方式,但是最先认识到它们是快捷方式,随着时间的推移它们将需要额外的照顾,支持和维护。我在这个主题上听到的最好的建议是首先产生完全和正确的规范化布局,然后才引入可控的非规范化来支持你的目标。

+0

是的,我并不期望创建24个桥接表......此外,感谢关​​键字“肥料”!这就是我需要找到更多信息。 (在我使用非常通用的搜索术语之前,并没有提供任何内容。)我试图避免将资源全部放在一张桌子上。它们包含不同类型的数据(网址,ISBN#,ID等) – Andir 2010-08-04 17:30:04

0

希望这是不言自明的。

resource_model_v2

+0

这实际上是我测试的第一个设计之一,但我最大的“抱怨”是有人不理解什么正在进行并将相同的资源ID放在Resource1和Resource3中。 ResourceType是我所指的外部逻辑。它可以工作,但它不是标准化的,并且不会强化设计中的数据完整性。 (我在上面的问题中列出的是没有更好的...我不是说...) – Andir 2010-08-04 18:05:54

+0

看起来正常化给我。为了强制执行独占子类型,可以将ResourceType添加到每个子类型表中,并对该类型使用检查约束。稍后,加入ResourceId和ResourceType。 – 2010-08-04 18:15:35

+0

但是通过在资源表的每个记录中放置该类型,可以将其解除规范化......这将起作用,我不会争辩。 – Andir 2010-08-04 18:35:17

相关问题