2009-12-17 59 views
4

新手程序员在这里。无效的外键

我有3个表,即产品,类别和子类别。我配置了它们之间的关系是这样的:

产品类别:许多一对多
产品给子类别:一比一
子类别分类:多对一一个

我添加了一个subcategory_id列,它是产品表中的外键(用于映射产品和子类别表)。这适用于产品有子类别的情况。现在的问题是我有没有子类别的产品。假设subcategory_id列将为空,但不允许。有没有解决方法?我也认为关系配置与此有关。有什么想法吗?

+0

添加一个默认子类别并将其分配给没有子类别的产品 – 2009-12-17 03:37:16

+4

@ Pandiya Chendur - 如果您已将该建议作为适当的响应,我会降低它的评价。在这些情况下生成无意义的记录是不好的做法。魔法值永远是。他们不仅延续了一个有缺陷的数据模型,而且必须通过随后的编程活动来处理,并在被遗忘时导致错误的结果。 – APC 2009-12-17 05:05:42

回答

4

只要subcategory_id可以为空,您应该能够添加一个外键,该外键在列不为空的所有情况下强制执行关系的完整性。这是一个相当常见的用例。

+0

谢谢你的快速回答先生。 “你应该可以添加一个外键,在列不为空的所有情况下,这个外键将强制关系的完整性” - 请在这方面给我更多启发,但是我没有很好地理解它。 – 2009-12-17 03:39:39

+1

Ed,他意味着只要该字段不为空,该字段的值就会作为另一个表/记录的有效外键强制执行。 – Anthony 2009-12-17 03:51:55

0

产品类别:许多一对多

产品给子类别:一比一

子类别分类:多对一一个

这是没有意义的。如果产品和子类是一对一的,那么它们是同一个实体。或者他们是1比0/1?无论如何,无论如何,如果他们是一对一或一到零或一个,那么每个产品都来自不同的子类别,并且每个子类别最多只有一个产品分配给它。如果这是真的,那么产品与类别是一对多并且子类别与类别是一对多的情况并非如此。

想一想。如果一个产品可能有很多Categorys,但是一个产品只有一个子类别,那么子类别可以有很多类别,这与您对类别和子类别的基数有相反之处:一对多

通常情况下,产品类别和子类别的关系如下:

类别到子类别一对多(每个类别的许多subcategries - 每个子类只有一个类别)

次类别产品:一对多,许多产品可以在每个子类别中。但是每个产品最多只有一个子类别。

你确定这不是你的结构吗? ...

+0

如果一个产品可能有多个类别但只有一个子类别,我可以问一个关于什么是关系映射的建议吗?此外,该类别可能有许多子类别。 – 2009-12-17 03:57:33

+0

然后,通过产品(其中可能有很多)到达的类别与产品子类别中的类别实体不同 - 只能有一个产品子类别,因此每个子类别都会唯一确定类别。因此,这不是一组一致的关系。 – 2009-12-17 04:06:23

+0

这就好像说实体A是多对一个实体B一样,这对实体C来说是一个实体,实体C是一个实体A的实体。这表示逻辑上不一致的一组关系。 – 2009-12-17 04:07:40

1

产品给子类别:一比一

难道不该 产品到子目录:多对一一个

为什么是不可能的使subcategory_id列default null