Database Dbs中的多重继承建模

Database Dbs中的多重继承建模,database,database-design,Database,Database Design,我正在为一个有礼物的系统建模。这些礼物可以是你提供的礼物,也可以是你收到的礼物。此外,这些礼物可以是单个或多个,最后它们也可以是一种类型,如玩具、食物、旅行或其他 因此,我想到: Presents --> Toys --> Offer --> Single | | --> Multiple | --> Receive --> Single |

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

因此,我想到:

Presents --> Toys --> Offer   --> Single
         |        |           --> Multiple
         |        --> Receive --> Single
         |                    --> Multiple
         --> Food --> Offer   --> Single
         |        |           --> Multiple
         |        --> Receive --> ...
         --> Trip --> ..
         --> Other --> ..
我发现这是我的系统的唯一解决方案。所有的“leafs”将在不同的表中实现,这是因为所有的“leafs”可以有不同的模型,有时它会是一个以上的属性。有时会更糟。因此,它是一个三重继承,其中当前类的模型在属性上取决于三个因素

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

提前谢谢。

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

  • 有一些概念:礼物、玩具、食物、旅行、其他、提供、接收、单个、多个
  • 这些概念中的每一个都有一组稳定的属性
  • 目前有16个表,每个表的结构都不同
  • 您的模型可以用10个表来描述,每组稳定属性一个表,加上一个链接表将它们连接在一起

    链接表需要稀疏列,即(玩具、食品、旅行、其他)的四个参考列中有三个为空,因此这不是标准化的,而是更像一个数据仓库模式

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


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

    这里有一个非常类似的问题

    如果您使用的是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);
    
    本文很好地解释了何时以及如何使用继承:


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

    提供和接收意味着什么?为什么它很重要?
     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);