我正在尝试为服务器和数据库清单设计一个数据库,并且我正在寻找一个好的数据库设计。我们有用于服务器集群、独立服务器和数据库的表。我想在数据库中表示以下关系:
从集群到服务器的一对多关系。
从数据库到集群/服务器的一对多关系。
困难在于第二种关系,因为集群和服务器位于不同的表中,并且集群由服务器组成。代表这种关系的最佳方式是什么?
我正在尝试为服务器和数据库清单设计一个数据库,并且我正在寻找一个好的数据库设计。我们有用于服务器集群、独立服务器和数据库的表。我想在数据库中表示以下关系:
从集群到服务器的一对多关系。
从数据库到集群/服务器的一对多关系。
困难在于第二种关系,因为集群和服务器位于不同的表中,并且集群由服务器组成。代表这种关系的最佳方式是什么?
听起来你在你对情况的关系视图中有这个。
Cluster : name, other attributes of cluster
Server : name, optional FK to cluster, other attributes of a server
Database : name, (FK to cluster OR FK to server)
问题是你有一个更复杂的现实世界情况,关系技术不能清楚地反映这种情况。
Host -- an abstract superclass for places a database can run.
Cluster (extends Host) : name, etc.
Server (extends Host) : name, optional FK to cluster.
Database : FK to Host
您有多种选择来处理这种“子实体”问题。
将主机、集群和服务器折叠到一个表中。这导致主机(作为集群)和主机(作为服务器)之间的递归关系。这有点烦人,但它确实为主机、集群和服务器创建了一个表。结果表有很多空值(集群行使用一组列,服务器行使用一组不同的列。)您必须添加一列来区分主机的子实体。
将主机信息下推到集群和服务器中。当您在 Host 表中有很多公共信息,而在 Cluster 或 Server 表中有很少的子类特定信息时,这很有用。Cluster 和 Server 表看起来非常相似(基本上是 Host 的克隆),但有几列不同。
基于主机中的鉴别器在(主机和集群)或(主机和服务器)之间使用连接。虽然相当复杂,但它的扩展性很好,因为所有数据库都加入了主机,并且完整的主机列表是加入服务器的主机和加入集群的主机的联合。
使用数据库中的可选外键字段。这需要加入集群的数据库加上加入服务器的数据库之间的联合,以获得完整的数据库列表。每个数据库可能必须有一个鉴别器,以便您可以区分两个 FK 字段中 NULL 值的各种组合。有四种可能的组合,其中两种是明智的,两种可能是禁止的。尝试简单地使用两个可为空的 FK 通常效果不佳,因此您通常需要一个状态标志来将集群上的数据库与服务器上的数据库与未分配给任何内容的数据库、主机未知的数据库与可能存在的任何其他状态分开相关的。
选项 1:在数据库表中有两个字段。一个指服务器,另一个指集群。保持其中之一为空。
选项 2:另一种方法是在集群中也为每个独立服务器添加一个条目,并仅链接到该表。
选项 1 真的不是最干净的解决方案(我同意评论),所以选择选项 2 :)