Java 如何在具有多种所有者类型的实体上设计映射

Java 如何在具有多种所有者类型的实体上设计映射,java,mysql,hibernate,Java,Mysql,Hibernate,由于缺乏经验,我在设计上陷入了困境 我有一张叫做服务器的桌子。在一列中,我需要持有一个外键作为此服务器的“所有者”。但是,所有者可以是供应商,也可以是客户。因此有3种可能性: 1) 为每种类型的所有者设置一列 Server_Id | Server_Address | Vendor_Id | Customer_Id 2) 为每种类型的所有者创建一个表 VendorServer_Id | Server_Address CustomerServer_Id | Server_Address 问题是

由于缺乏经验,我在设计上陷入了困境

我有一张叫做服务器的桌子。在一列中,我需要持有一个外键作为此服务器的“所有者”。但是,所有者可以是供应商,也可以是客户。因此有3种可能性:

1) 为每种类型的所有者设置一列

Server_Id | Server_Address | Vendor_Id | Customer_Id
2) 为每种类型的所有者创建一个表

VendorServer_Id | Server_Address

CustomerServer_Id | Server_Address

问题是,正如您所看到的,表或列的数量随着所有者类型的增加而增加。传统的解决方案是什么

以下是您的方法的缺点
Sol 1.
如果是这种情况,如果明天图片中出现新的所有者类型,则需要创建一个新列来维护其id。在所有行中,它可能是供应商id或客户id,看起来不正常
sol2.
需要为将来引入的新所有者类型创建一个新表。这确实很贵,但比Sol 1好
我建议您维护两张表,如下所示

服务器详细信息

Server_Id | Server_Address | Owner_Id 
Owner_Id | Owner_Id_Type
所有者详细信息

Server_Id | Server_Address | Owner_Id 
Owner_Id | Owner_Id_Type
Server\u Detail
中的
Owner\u Id
外键中
Owner\u Id
Owner\u Detail
表中。

您可以在代码中定义
Owner\u Type
enum
,即现在的
Vendor
Customer
Owner\u Id
中的值需要根据
Owner\u Type
值进行解释
Owner\u Type
创建一个表也是明智的,如下所示

Owner_Id_Type | Description 

并使用
服务器
表引入一个
外键
。这确保了只允许受限的
所有者类型

但如果我使用此解决方案,那么所有者Id将不会是外键,对吗?感谢更新,但这不会限制在所有者Id上写入不存在的值。我仍然得到了它。现在再次更新答案。这是否符合您的要求?添加新所有者只需在Owner\u Type表中添加一个条目,并在Owner\u Detail表中添加具有此新Owner\u类型的条目。我将使用Owner\u Type Owner\u Id对,但在这个阶段我不会在我的模型中引入Owner实体,因此我认为这解决了我主要关心的拥有更多所有者类型的问题。:)