Java 如何在具有多种所有者类型的实体上设计映射
由于缺乏经验,我在设计上陷入了困境 我有一张叫做服务器的桌子。在一列中,我需要持有一个外键作为此服务器的“所有者”。但是,所有者可以是供应商,也可以是客户。因此有3种可能性: 1) 为每种类型的所有者设置一列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 问题是
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实体,因此我认为这解决了我主要关心的拥有更多所有者类型的问题。:)