如何建模继承
How to Model Inheritance
我在选择一种方法来模拟以下关系时有点困惑。
场景:
系统有用户
用户可以执行 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:
single-table-inheritance
class-table-inheritance
这两个中的一个应该适合您的情况。
您有两种选择如何实现由 Seller
和 DeliverySubscriber
构成的 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 层次结构的形式
我在选择一种方法来模拟以下关系时有点困惑。
场景:
系统有用户
用户可以执行 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:
single-table-inheritance class-table-inheritance
这两个中的一个应该适合您的情况。
您有两种选择如何实现由 Seller
和 DeliverySubscriber
构成的 class 层次结构,它们是 User
的子类型。如果你的 subclasses/subtables 没有很多额外的 properties/columns,通常会使用 Single Table Inheritance仅使用一个 table User
和一个 type
(或 category
)列的方法,用于区分卖家用户和交付订阅者用户。否则,如果有很多额外的properties/columns,最好使用加入Table继承的方式,其中subtables(代表 subclasses)通过它们的主键连接到它们的 supertable,它们也是引用 supertable 的外键。您可以在我的书章节 Subtyping and Inheritance.