Dbs 中的多重继承建模



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

所以,我想到了:

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

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

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

提前谢谢。琼

不知道更多,我只能推测,但做一些假设:

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

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

链接表需要稀疏列,即在四个引用列中的三个(玩具、食物、旅行、其他)中都有 null,所以这不是规范化的,但更像是数据仓库模式。

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

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

这仍然有点令人不快,因为这个事实表可能需要额外的列,因为需要新的事物种类,但是添加可为空的列是非常安全的事情。

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

如何使用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 模型。 请记住,对程序中的数据进行建模可能是父级>子级,但对数据库中的数据进行建模可能是反向的。

最新更新