"Product Category" 应该与 "Product" 有识别关系吗?
Should "Product Category" have an identifying relationship with "Product"?
我有一个 table product(id, name)
,其中包含几组型号不同的产品。即 {motor10、motor20、motor30、pipe10、pipe20、pipe30、wrench12、wrench20 等}。
我选择创建一个名为 product category
的新 table,它只包含类别,例如{电机、管道、扳手、未分类}
问题
出于应用程序的实际目的(而不是出于理论上的目的,例如为 ER 图建模),我应该使用识别关系还是非识别关系?
我的用例
在我的例子中,我可以定义它,这样一个产品就不能没有类别。但是,如果产品尚未分类,则它在类别中具有 uncategorized
值。类别可以包含尚未分配任何产品的条目。
类别是一个虚构的概念,我并不是真的必须使用它,但它会帮助我对我目前拥有的产品集进行分类。我认为因为它是一个虚构的概念,而且我不确定我想如何使用它,这就是我在这个问题上苦苦挣扎的原因。又名.. 我根本没有 table product_category
,但它肯定会帮助我进行各种产品分组。
使这种识别关系需要我修改和重写一些代码,我想确保在我开始编写大量代码之前我确实想要使这种识别关系成为一种识别关系。
... 也就是说,是否存在我不会将其作为识别关系的情况?
我会
- 将
product_category
table 保留为非识别关系。
- 有默认的
product_category
行 category_name
= Uncategorized
和 id
= 1
.
- 为
product
table 中的列 product_category_id
设置默认值 1
,以便所有新的 product
行没有product_category
自动分配默认为 Uncategorized
.
您可以将 product_category
声明为强制性的——即 NOT NULL
——而不使其成为识别关系的一部分。
标识关系意味着该属性是 table 主键的一部分。我认为这不适用于您的情况。 table 可以具有 NOT NULL
属性,而无需将它们作为 table 主键的一部分。
回复您的评论:
定义标识关系的另一种方法是,如果不引用父行,子行 table 中的行将无法唯一标识。
但在您的情况下,即使产品不属于某个类别,或者如果它属于多个类别(如果您有一个多对-很多关系)。
也许存在并不是真正正确的标准。但是,您可以使用其他属性(即主键)识别 产品而不提及其类别吗?还是可以在不改变产品唯一标识的情况下改变产品类别?
以住在某州的美国公民为例。该州可能是强制性的(为了争论,不考虑居住在国外或美国领土上的公民)。该公民的当前状态是否存在识别关系?不;他们可以从一个州搬到另一个州,但他们仍然是同一个人。状态只是一个属性,即使它是强制性的。
而另一个例子,如购物车中的订单项,确实与其父购物车有识别关系。没有特定的购物车,订单项不存在。
一个更灰暗的例子是电话phone号码。我目前 "own" 我的 telephone 号码,拥有一个没有所有者的 telephone 号码是没有意义的。但如果我放弃我的号码,phone 公司可以将它重新分配给另一个所有者。我不确定这是否构成识别关系。
我有一个 table product(id, name)
,其中包含几组型号不同的产品。即 {motor10、motor20、motor30、pipe10、pipe20、pipe30、wrench12、wrench20 等}。
我选择创建一个名为 product category
的新 table,它只包含类别,例如{电机、管道、扳手、未分类}
问题
出于应用程序的实际目的(而不是出于理论上的目的,例如为 ER 图建模),我应该使用识别关系还是非识别关系?
我的用例
在我的例子中,我可以定义它,这样一个产品就不能没有类别。但是,如果产品尚未分类,则它在类别中具有 uncategorized
值。类别可以包含尚未分配任何产品的条目。
类别是一个虚构的概念,我并不是真的必须使用它,但它会帮助我对我目前拥有的产品集进行分类。我认为因为它是一个虚构的概念,而且我不确定我想如何使用它,这就是我在这个问题上苦苦挣扎的原因。又名.. 我根本没有 table product_category
,但它肯定会帮助我进行各种产品分组。
使这种识别关系需要我修改和重写一些代码,我想确保在我开始编写大量代码之前我确实想要使这种识别关系成为一种识别关系。
... 也就是说,是否存在我不会将其作为识别关系的情况?
我会
- 将
product_category
table 保留为非识别关系。 - 有默认的
product_category
行category_name
=Uncategorized
和id
=1
. - 为
product
table 中的列product_category_id
设置默认值1
,以便所有新的product
行没有product_category
自动分配默认为Uncategorized
.
您可以将 product_category
声明为强制性的——即 NOT NULL
——而不使其成为识别关系的一部分。
标识关系意味着该属性是 table 主键的一部分。我认为这不适用于您的情况。 table 可以具有 NOT NULL
属性,而无需将它们作为 table 主键的一部分。
回复您的评论:
定义标识关系的另一种方法是,如果不引用父行,子行 table 中的行将无法唯一标识。
但在您的情况下,即使产品不属于某个类别,或者如果它属于多个类别(如果您有一个多对-很多关系)。
也许存在并不是真正正确的标准。但是,您可以使用其他属性(即主键)识别 产品而不提及其类别吗?还是可以在不改变产品唯一标识的情况下改变产品类别?
以住在某州的美国公民为例。该州可能是强制性的(为了争论,不考虑居住在国外或美国领土上的公民)。该公民的当前状态是否存在识别关系?不;他们可以从一个州搬到另一个州,但他们仍然是同一个人。状态只是一个属性,即使它是强制性的。
而另一个例子,如购物车中的订单项,确实与其父购物车有识别关系。没有特定的购物车,订单项不存在。
一个更灰暗的例子是电话phone号码。我目前 "own" 我的 telephone 号码,拥有一个没有所有者的 telephone 号码是没有意义的。但如果我放弃我的号码,phone 公司可以将它重新分配给另一个所有者。我不确定这是否构成识别关系。