“产品类别”是否应与“产品”具有识别关系?

时间:2016-09-06 23:21:10

标签: mysql sql database-design identifying-relationship

我有一个表product(id, name),其中包含几组不同型号的产品。即{motor10,motor20,motor30,pipe10,pipe20,pipe30,wrench12,wrench20等}。

我选择创建一个名为product category的新表,其中只包含类别,例如{motor,pipe,wrench,uncategorized}

enter image description here

问题

对于应用程序中的实际用途(而不是用于建立ER图的理论目的),我应该使用识别或非识别关系吗?

我的用例 就我而言,我可以定义它,以便产品在没有类别的情况下不能存在。但是,如果产品尚未归类,则其类别中包含uncategorized值。类别可以包含尚未分配任何产品的条目。

类别是一个我不需要使用的虚构概念,但它可以帮助我对我目前拥有的产品集进行分类。我认为因为它是一个组成概念,我不确定我是如何使用它的,这就是为什么我在努力解决这个问题。又...我根本没有拥有表product_category,但它肯定会帮助我进行各种产品分组。

使这个识别关系需要我修改和重写一些代码,我想确保在我离开并编写大量代码之前,我想确定这是一个识别关系。

...那说,是否会出现这样一种情况:我不会将其作为识别关系?

2 个答案:

答案 0 :(得分:1)

我会

  1. product_category表保留为非标识关系。
  2. 拥有product_category = category_nameUncategorized = id的默认1行。
  3. 1表格中的product_category_id列的默认值为product,因此未分配product的所有新product_category行自动默认为Uncategorized

答案 1 :(得分:1)

您可以将product_category声明为必填项,即NOT NULL - 而不将其作为识别关系的一部分。

标识关系意味着该属性是表的主键的一部分。我不认为这适用于您的情况。表可以具有NOT NULL属性,而不会使它们成为表的主键的一部分。

重新评论:

定义标识关系的另一种方法是,在不引用父级的情况下,无法唯一地标识子表中的行。

但在您的情况下,您可以轻松拥有一个存在且可以识别的产品,即使它尚未属于某个类别,或者它属于多个类别(如果您有多对多的类别)关系)。

也许存在不是真正合适的标准。但是,您能否使用其他属性(即主键)识别产品而不提及其类别?或者产品的类别是否会发生变化,而不会改变产品的唯一标识?

以一个居住在州内的美国公民为例。国家可能是强制性的(为了争论,不考虑居住在国外或美国领土的公民)。该公民目前的状态是否存在识别关系?没有;他们可以从一个州搬到另一个州,他们仍然是同一个人。国家只是一个属性,即使它是强制性的。

而另一个示例(如购物车中的订单项)与其父购物车确实存在识别关系。如果没有特定的购物车,订单项就不存在。

更灰色的示例是电话号码。我目前“拥有”我的电话号码,拥有没有所有者的电话号码是没有意义的。但是,如果我放弃我的号码,电话公司可以将其重新分配给另一位所有者。我不确定这是否构成了识别关系。