0

我正在建模一个有礼物的系统。这些礼物可以是您提供的礼物或您收到的礼物。此外,这些礼物可以是单个或多个,最后它们也可以是一种类型,如玩具、食物、旅行或其他。

所以,我想到了:

Presents --> Toys --> Offer   --> Single
         |        |           --> Multiple
         |        --> Receive --> Single
         |                    --> Multiple
         --> Food --> Offer   --> Single
         |        |           --> Multiple
         |        --> Receive --> ...
         --> Trip --> ..
         --> Other --> ..

我发现这是我系统的唯一解决方案。所有的“叶子”都将在不同的表中实现,那是因为所有的“叶子”可以有不同的模型,有时它会是一个更多的属性。有时会更多。因此,它是一个三重继承,其中 Present 类的模型的属性取决于三个因素。

问题是,如果您知道我的意思,我发现这个解决方案非常丑陋。这就是为什么我想问问你们对这个问题的看法。

提前致谢。琼

4

2 回答 2

1

在不了解的情况下,我只能推测,但做一些假设:

  1. 有一些概念:礼物,玩具,食物,旅行,其他,提供,接收,单一,多重。
  2. 这些概念中的每一个都有一组稳定的属性。
  3. 目前您有 16 个表,每个表的结构都不同。

您的模型可以用 10 个表来描述,每组稳定属性一个,加上一个将它们拉到一起的链接表。

链接表需要稀疏列,即(玩具、食物、旅行、其他)的四分之三的参考列中有空值,所以这不是标准化的,但更像是数据仓库模式。

事实表看起来有点像(省略列类型):

gift_id not null, //primary key
present_id not null, // always have one of these
toy_id null, //refers to a row in the toy table
food_id null, // refers to a row in the food table...and so on below
trip_id null,
other_id null,
offer_id null,
receive_id null,
single_id null,
multiple_id null

仍然有点不愉快,因为这个事实表可能需要额外的列,因为需要新的东西,但是添加可以为空的列是一个非常安全的事情。

于 2012-09-18T14:07:34.680 回答
0

这里有一个非常相似的问题......

如何用 RDBMS 建模这种多重继承关系?

如果您使用的是 PostgreSQL,则允许多重继承。

 CREATE TABLE presents
 (
    gift_id INT,
    PRIMARY KEY(gift_id)
 );

 CREATE TABLE offer_receiver
 (
   is_offer BOOLEAN,
   PRIMARY KEY(is_offer)
 );

 CREATE TABLE present_quantity
 (
   qty_received INT,
   PRIMARY KEY(qty_received)
 );

 CREATE TABLE present_info
 (
   person_id INT,
   PRIMARY KEY(person_id)
 ) INHERITS(present, offer_receiver, present_quantity);

这篇文章很好地解释了何时以及如何使用继承:

http://ledgersmbdev.blogspot.com/2012/08/postgresql-or-modelling-part-3-table.html

话虽如此,重新考虑这种设计可能是一个好主意。这看起来更像是一个对象层次结构,而不是一个 ER 模型。请记住,在程序中建模数据可能是父->子,但在数据库中建模数据可能是倒退的。

于 2014-07-20T06:15:00.963 回答