单桥表还是有更好的方法吗?

时间:2010-08-04 16:22:14

标签: sql database-design

我一直试图找到答案,我不知道描述它的最佳方式。

基本上,我有3个源表,每个源表都有uniqueidentifier键。我们将这些表称为Skill1,Duty2,Custom3。除了它们是特定工作的属性之外,它们不以任何方式彼此链接(容易)。我想把资源与这些技能(例如:一本书,一个网址,一个课程ID)从现在的8个不同的表格(我将称之为Resource1 - Resource8)联系起来。这是为了允许将这些类型的资源的任何组合链接到所述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个属性表链接到资源而不复制其他地方已经存在的数据? (即:制作一个包含所有可能的属性组合的“作业”表,或者将我的所有资源表混合到一个包含大量可空列的表中)

2 个答案:

答案 0 :(得分:2)

在第3个普通表单数据库中,根据您所描述的内容,您需要一个链接每个属性和每个可能资源表的桥接表。任何类型的快捷方式(例如您提出的建议)都会导致问题(例如您发现的内容 - 关于此主题的好文章可以在SQL Server Central上找到,或者可能在Google上找到“MUCK表” 。)

8个资源表中的数据是否可以修改为一个表,如:

ResourceUniqueId
ResourceType
ResourceName
ResourceEtc

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

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

如果不这样做,受控制的非规范化可能会有所帮助。创建组合所有资源的单个表,然后将每个资源中的数据复制到其中。当然,非规范化的代价是,当(不是如果)资源被更新时,你必须在多个地方保持它们的同步,如果频繁更新,这可能是皇室的噩梦。

最终,如果您有复杂的数据,那么您将需要复杂的模型和代码来正确表示它。可以采用非规范化快捷方式,但事先认识到它们是快捷方式,并且随着时间的推移需要额外的关注,支持和维护。我在这个主题上听到的最好的建议是首先制作完全正确的标准化布局,然后引入受控的非规范化来支持你的目标。

答案 1 :(得分:0)

希望这是不言自明的。

resource_model_v2

相关问题