我有一个表product(id, name)
,其中包含几组不同型号的产品。即{motor10,motor20,motor30,pipe10,pipe20,pipe30,wrench12,wrench20等}。
我选择创建一个名为product category
的新表,其中只包含类别,例如{motor,pipe,wrench,uncategorized}
问题
对于应用程序中的实际用途(而不是用于建立ER图的理论目的),我应该使用识别或非识别关系吗?
我的用例
就我而言,我可以定义它,以便产品在没有类别的情况下不能存在。但是,如果产品尚未归类,则其类别中包含uncategorized
值。类别可以包含尚未分配任何产品的条目。
类别是一个我不需要使用的虚构概念,但它可以帮助我对我目前拥有的产品集进行分类。我认为因为它是一个组成概念,我不确定我是如何使用它的,这就是为什么我在努力解决这个问题。又...我根本没有拥有表product_category
,但它肯定会帮助我进行各种产品分组。
使这个识别关系需要我修改和重写一些代码,我想确保在我离开并编写大量代码之前,我想确定这是一个识别关系。
...那说,是否会出现这样一种情况:我不会将其作为识别关系?
答案 0 :(得分:1)
我会
product_category
表保留为非标识关系。 product_category
= category_name
和Uncategorized
= id
的默认1
行。1
表格中的product_category_id
列的默认值为product
,因此未分配product
的所有新product_category
行自动默认为Uncategorized
。答案 1 :(得分:1)
您可以将product_category
声明为必填项,即NOT NULL
- 而不将其作为识别关系的一部分。
标识关系意味着该属性是表的主键的一部分。我不认为这适用于您的情况。表可以具有NOT NULL
属性,而不会使它们成为表的主键的一部分。
重新评论:
定义标识关系的另一种方法是,在不引用父级的情况下,无法唯一地标识子表中的行。
但在您的情况下,您可以轻松拥有一个存在且可以识别的产品,即使它尚未属于某个类别,或者它属于多个类别(如果您有多对多的类别)关系)。
也许存在不是真正合适的标准。但是,您能否使用其他属性(即主键)识别产品而不提及其类别?或者产品的类别是否会发生变化,而不会改变产品的唯一标识?
以一个居住在州内的美国公民为例。国家可能是强制性的(为了争论,不考虑居住在国外或美国领土的公民)。该公民目前的状态是否存在识别关系?没有;他们可以从一个州搬到另一个州,他们仍然是同一个人。国家只是一个属性,即使它是强制性的。
而另一个示例(如购物车中的订单项)与其父购物车确实存在识别关系。如果没有特定的购物车,订单项就不存在。
更灰色的示例是电话号码。我目前“拥有”我的电话号码,拥有没有所有者的电话号码是没有意义的。但是,如果我放弃我的号码,电话公司可以将其重新分配给另一位所有者。我不确定这是否构成了识别关系。