空外键

4

我是一名新手程序员。

我有三个表,分别为产品、类别和子类别。我将它们的关系配置如下:

产品到类别:多对多
产品到子类别:一对一
子类别到类别:多对一

我添加了一个subcategory_id列,它是产品表中的外键(用于映射产品和子类别表)。如果一个产品有一个子类别,这样就可以工作。现在的问题是,我有一些没有子类别的产品。子类别_id列应该为空,但是不允许为空。是否有解决办法?我认为关系配置与此有关。你有什么想法吗?


为没有子类别的产品添加一个默认子类别并将其分配给该产品。 - ACP
4
如果您将那个建议作为正式回复提出来,我会对它进行投票。在这些情况下生成无意义的记录是不好的做法,魔术数值总是如此。它们不仅延续了有缺陷的数据模型,而且必须由后续的编程活动处理,当被遗忘时,会导致错误的结果。 - APC
3个回答

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

感谢您的快速回答。“只要该列不为空,您应该能够添加一个外键来强制执行关系的完整性。” - 请再详细解释一下,我没有完全理解。 - Ed.
1
Ed,他的意思是每当该字段不为空时,该字段的值将被强制作为另一个表/记录的有效外键。 - Anthony

1
产品到子类别:一对一
难道不应该是 产品到子类别:多对一 为什么不能将subcategory_id列设置为默认null

0

产品到类别:多对多

产品到子类别:一对一

子类别到类别:多对一

这没什么意义。如果产品和子类别是一对一的,那么它们就是同一个实体。或者它们是一对零/一?

无论如何,无论是一对一还是一对零或一,每个产品都来自不同的子类别,每个子类别最多只分配给一个产品。如果是这样,则不能出现产品与类别为一对多,子类别与类别为一对多的情况。

想想看。如果单个产品可以有多个类别,但是每个产品只有一个子类别,那么一个子类别可以有多个类别,这与您所具有的类别和子类别的基数是相反的:一对多

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

类别到子类别:一对多(每个类别有多个子类别 - 每个子类别只属于一个类别)

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

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


我可以问一个关于关系映射的建议吗?如果一个产品可以有多个分类,但只能有一个子分类,那么关系映射应该是什么样的呢?另外,这个分类可能会有很多子分类。 - Ed.
通过产品(其中可能有许多)到达的类别与从产品子类别到达的类别实体不同 - 在那里只能有一个,因为每个子类别唯一确定了类别。因此,这不是一组一致的关系。 - Charles Bretana
这就像说实体A是一对多到实体B,实体B是一对多到实体C,实体C又是一对多到实体A... 这代表了一个逻辑上不一致的关系集合。 - Charles Bretana
正如@Willi在另一个答案中建议的那样,产品到子类别不是多对一吗?同一个子类别中不能有多个产品吗?而且一个产品不能属于多个子类别,这不是真的吗? - Charles Bretana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接