如何建模继承

How to Model Inheritance

我在选择一种方法来模拟以下关系时有点困惑。

场景:

  1. 系统有用户

  2. 用户可以执行 2 个功能:

    • 他可以是可以购买网站上列出的产品的普通用户。
    • 他可以在网站上订阅销售产品。
    • 他可以订阅送货服务以送货他所下的订单
      来自网站
    • 他可以同时订阅,即销售产品和订阅 送货服务。

我如何为既能执行卖家功能又能发出交货请求的用户建模。

                               User
                                 |
                                 |
         _________________________________________________
        |                                                 |
      Seller (ONLY)                                   Delivery (ONLY)

                      **SELLER AND DELIVERY** 

我只使用 3 tables:User、UserSeller、UserDelivery 以及 User table 中的 UserType 字段来指示适用哪种情况。三个 table 有一个共同的主键。

假设此人必须是用户,也可以是卖家或送货人或两者 - 关系应该是 - 用户 ------ 卖家 - 1:1 (一对一 - 任何用户都可以是一个卖家,每个卖家都必须是一个用户)。 Delivery 也是一样(用户可以签收,送货必须是用户本人)。

在 c# 中 - 这意味着卖家 class 源自用户,与交付 class 相同。

在数据库中 - dilevery 和 Seller 表将保存 FK 到用户 PK,这也将是他们的主键。

如果您只对 ER 建模感兴趣,请查看 "generalization/specialization"。

如果您对 table 设计感兴趣,请查看这两个标签的问题和标签 wiki:

这两个中的一个应该适合您的情况。

您有两种选择如何实现由 SellerDeliverySubscriber 构成的 class 层次结构,它们是 User 的子类型。如果你的 subclasses/subtables 没有很多额外的 properties/columns,通常会使用 Single Table Inheritance仅使用一个 table User 和一个 type(或 category)列的方法,用于区分卖家用户和交付订阅者用户。否则,如果有很多额外的properties/columns,最好使用加入Table继承的方式,其中subtables(代表 subclasses)通过它们的主键连接到它们的 supertable,它们也是引用 supertable 的外键。您可以在我的书章节 Subtyping and Inheritance.

中阅读更多关于这两种使用 table 实现 class 层次结构的形式