SQL表完整性

时间:2016-05-09 09:53:18

标签: sql sql-server

我正在使用SQL Server 2014,但我正在寻找一种设计解决方案。

我需要将3个表连接在一起以确保完整性。为了清楚起见,我删除了一些表格和列。

enter image description here

Group是type的父类。

Group: Widgets
Types: Blue Widgets, Red Widgets

我想在组/类别级别存储数据,例如:

Group: Widgets
Categories: Widgets for men, Widgets for women

类别应该在类型级别

Type: Blue Widgets
Category: Widgets for men

Type: Red Widgets
Category: Widgets for women

因此,我正在努力确保我输入TypeCat的数据有效,因为GroupCat中存在Category和Type的组。

我确定这种模式有某种形式,但作为一个非DB人,我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

冒着在你的问题上花费太多时间的风险,我会试着告诉你解开是多么困难。您使用一系列抽象名词 - 类型,类别,组 - 以不同的组合。您可以在图示的表格和问题文本之间更改术语。你没有说明密钥是什么。然后你做一些声明,并期望读者做出正确的联想和推论。

  

Group是type的父类。

所以GroupID标识GroupType;因此GroupType具有TypeID。无论如何,这就是我如何解释" parent"。

  

类别应该在类型级别

鉴于下一个陈述,我无法理解这一点:

  

确保我输入TypeCat的数据有效,因为GroupCat中存在Category和Type&#39>

不确定"那"类别是,但规则似乎是

TypeCat.TypeID exists in GroupType.TypeID
GroupType.GroupID exists in GroupCat.GroupID

但你也说过

  

我想在组/类别级别存储数据

这似乎意味着新数据来自左侧,并且GroupCat中的新行必须满足某些约束:

GroupCat.GroupID exists in GroupType.GroupID -- opposite above
GroupCat.CatID   exists in TypeCat.CatID
{GroupCat.GroupID,TypeCat.TypeID} exists in GroupType

这些规则可以在SQL中表达,但我不确定它们应该如何。而且我不确定他们是否符合您的意图。我投掷飞镖,如果不是完全被蒙住眼睛,让我们说灯光还有一些不足之处。

通常,SQL中的语句A must have a B表示存在表示其类型值的域的表B,以及A中的列的外键,其值必须来自该域。根据该逻辑,模型中应该有用于组,类别和类型的表。上面的最后一条规则的模式 - 必须连接两个表以确定它们是否符合第三个域 - 确实会发生,但很少。当它突然出现时,通常会仔细查看并确保模型真实地反映现实。