2011-03-29 128 views
0

我相信我不是第一个提出这个问题的人,但我找不到一个好的答案,我承认数据库设计不是我的主要优势。数据库设计:在超类型/子类型上加入表

假设我有一个产品,并且此产品可以有子类型,产品A,产品B,产品C和产品D.超类型产品将具有一些共同属性,而子类型将具有特定于这些子类型的属性。相当标准的超类型/子类型设计。

现在我有一个用户实体。产品可以有许多用户,并且用户可以有许多产品。所以理想情况下,我想在这些连接表上加上一些关于该连接的特定属性。我遇到的问题是我不想做Product-User连接表,但更像是与User和Product子类型的连接,因此是ProductA-User,ProductB-User,ProductC-User,ProductD-User。原因是这两个实体的连接具有特定于该产品和用户连接的自己的属性。

这个设计是否有意义?还是有更好的方式来处理这种行为。我喜欢我的产品的标准超类型/子类型,但当我需要将它们与其他实体结合时,我不确定如何处理。

回答

2

在某些数据库中加入超类型是有意义的,在某些数据库中加入各个子类型是有意义的,并且在某些数据库中将不同数据加入到超类型和子类型中是有意义的。

真的是(ProductA,User)的表有不同的列(ProductB,User)吗?如果是这样,那么你的答案。不同的属性,不同的东西,不同的表格。将m:n表分开,并引用子类型。

(后来)

我回答another SO question并列入该做的正是这种代码。

+0

我看了一下你的例子,谢谢你指出了一个例子。这种情况下,与用户连接时的子类型会有不同的列。 ProductAUser和ProductBUser将具有不同的列。 – 2011-03-31 14:55:21

0

好吧,如果你想捕获有关ProductA-User关系和ProductB-User关系的不同信息,那么Product-User表似乎没有意义。就个人而言,当我有产品表,以及ProductA,ProductB等时,我对此表示遗憾,无论是出于性能还是可维护性原因。我的直觉反应通常是消除产品表。

+0

我普遍赞同这一点。其他一些要考虑的事项是某些数据库上的稀疏列,其中空列占用较少的空间。此外,如果您需要查询一个位置,则可以在ProductA,ProductB表的联合体上创建视图。 – squawknull 2011-03-29 01:27:24

+0

因此,对于这条路线,您是说真的没有理由使用超类型/子类型设计,并且只有ProductA,ProductB等表以及与用户的单独连接表?这可能会有一些冗余的数据,但如果稍后它会变得不那么麻烦,那么这可能是更好的选择。 – 2011-03-29 02:23:00